在 Databricks Runtime 14.1 及更高版本中可用,行跟踪会将稳定的行 ID 和行提交版本分配给每一行,从而启用行级世系跟踪。 某些具体化视图的增量更新需要启用此功能。
所有 Apache Iceberg v3 表都包含行跟踪。 请参阅 使用 Apache Iceberg v3 功能。 对于 Delta Lake 表,必须显式启用行跟踪。
注释
启用行跟踪会升级表编写器协议,并可能会影响与外部 Delta Lake 客户端的兼容性。 请参阅 Delta Lake 功能兼容性和协议。
在 Delta Lake 表上启用行跟踪
若要在 Delta Lake 表上启用行跟踪,在创建表期间设置表属性 delta.enableRowTracking = true :
CREATE TABLE table_name
TBLPROPERTIES (delta.enableRowTracking = true)
AS SELECT * FROM source_table;
若要对现有 Delta Lake 表启用行跟踪,请使用以下示例:
ALTER TABLE table_name SET TBLPROPERTIES (delta.enableRowTracking = true);
Important
对现有表启用行跟踪会自动将行 ID 和行提交版本分配给表中所有现有行。 此过程可能会导致创建多个新版本的表,并花费大量时间完成。
Warning
如果表是连续写入的目标,例如结构化流式处理工作负载,请在启用行跟踪之前暂停写入操作,并在操作完成后恢复。 使用 ALTER TABLE 启用行跟踪会更新表元数据,导致在操作期间任何并发写入操作失败并返回 MetadataChangedException。 请参阅 冲突异常。
克隆表会创建单独的历史记录,因此克隆表中的行 ID 和行提交版本与原始表中的行 ID 和行提交版本不匹配。
元数据字段
行跟踪将两个隐藏的元数据字段添加到表中。 可以将这些字段显式添加到查询以返回值。
| 列名称 | 类型 | 价值观 | Explanation |
|---|---|---|---|
_metadata.row_id |
Long | 行的唯一标识符。 | 每当使用 MERGE 或 UPDATE 语句修改行时,行将保留相同的 ID。 |
_metadata.row_commit_version |
Long | 上次插入或更新行时的 Delta 日志或表版本。 | 每当使用 MERGE 或 UPDATE 语句修改行时,将为其分配新版本。 |
某些操作使用事务日志存储这些元数据字段。 对启用了行跟踪的表运行 OPTIMIZE 或 REORG 操作会重写数据文件以存储这些字段。
关闭 Delta Lake 表的行跟踪
若要关闭 Delta Lake 表上的行跟踪,请将表属性设置为 false。
ALTER TABLE table_name SET TBLPROPERTIES (delta.enableRowTracking = false);
Important
禁用行跟踪不会删除相应的表功能,也不会降级表协议版本。 它也不会从目标表中删除元数据字段。 若要完全删除表功能并降级协议,请使用 DROP FEATURE。 请参阅删除 Delta Lake 表功能并降级表协议。
关闭行跟踪后,生成的行 ID 不再可靠,无法跟踪唯一行。
局限性
读取更改数据馈送时无法访问行 ID 和行提交版本元数据字段。 请参阅在 Azure Databricks 中使用更改数据馈送。