Azure Databricks中的行跟踪

在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 行的唯一标识符。 每当使用 MERGEUPDATE 语句修改行时,行将保留相同的 ID。
_metadata.row_commit_version Long 上次插入或更新行时的 Delta 日志或表版本。 每当使用 MERGEUPDATE 语句修改行时,将为其分配新版本。

某些操作使用事务日志存储这些元数据字段。 对启用了行跟踪的表运行 OPTIMIZEREORG 操作会重写数据文件以存储这些字段。

关闭 Delta Lake 表上的行跟踪

若要关闭 Delta Lake 表上的行跟踪,请将表属性设置为 false

ALTER TABLE table_name SET TBLPROPERTIES (delta.enableRowTracking = false);

Important

禁用行跟踪不会删除相应的表功能,也不会降级表协议版本。 它也不会从目标表中删除元数据字段。 若要完全删除表功能并降级协议,请使用 DROP FEATURE。 请参阅删除 Delta Lake 表功能并降级表协议

关闭行跟踪后,生成的行 ID 不再可靠,无法跟踪唯一行。

Limitations

读取更改数据馈送时无法访问行 ID 和行提交版本元数据字段。 请参阅在 Azure Databricks 中使用更改数据馈送