在Databricks Runtime 14.0及以上版本中,行追踪为每行分配稳定的行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 和行提交版本分配给表中所有现有行。 此过程可能会导致创建多个新版本的表,并花费大量时间完成。
警告
如果表是连续写入的目标,例如结构化流式处理工作负载,请在启用行跟踪之前暂停写入操作,并在操作完成后恢复。 使用 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 不再可靠,无法跟踪唯一行。
Limitations
读取更改数据馈送时无法访问行 ID 和行提交版本元数据字段。 请参阅在 Azure Databricks 中使用更改数据馈送。