跳到内容

为 Delta 表使用行跟踪

行跟踪允许 Delta Lake 跟踪 Delta Lake 表中的行级血缘。在 Delta Lake 表上启用行跟踪后,表会添加两个新的元数据字段

  • 行 ID 为行提供在表中唯一的标识符。使用 MERGEUPDATE 语句修改行时,行会保持相同的 ID。
  • 行提交版本记录了行被修改时表的最后一个版本。使用 MERGEUPDATE 语句修改行时,行会被分配一个新的版本。

您必须使用以下方法之一显式启用行跟踪

  • 新表:在 CREATE TABLE 命令中设置表属性 delta.enableRowTracking = true
-- Create an empty table
CREATE TABLE student (id INT, name STRING, age INT)
TBLPROPERTIES ('delta.enableRowTracking' = 'true');
-- Using a CTAS statement
CREATE TABLE course_new
TBLPROPERTIES ('delta.enableRowTracking' = 'true')
AS SELECT * FROM course_old;
-- Using a LIKE statement to copy configuration
CREATE TABLE graduate LIKE student;
-- Using a CLONE statement to copy configuration
CREATE TABLE graduate CLONE student;
  • 现有表:从 Delta 3.3 及更高版本开始,在 ALTER TABLE 命令中设置表属性 'delta.enableRowTracking' = 'true'
ALTER TABLE grade SET TBLPROPERTIES ('delta.enableRowTracking' = 'true');
  • 所有新表:在 SET 命令中为当前会话设置配置 spark.databricks.delta.properties.defaults.enableRowTracking = true
SET spark.databricks.delta.properties.defaults.enableRowTracking = true;

启用行跟踪可能会增加表的大小。Delta Lake 将行跟踪元数据字段存储在数据文件中的隐藏元数据列中。某些操作,例如仅插入操作,不使用这些隐藏列,而是使用 Delta Lake 日志中的元数据来跟踪行 ID 和行提交版本。数据重组操作(例如 OPTIMIZEREORG)会导致使用隐藏元数据列跟踪行 ID 和行提交版本,即使它们以前是使用元数据存储的。

行跟踪添加了以下可在读取表时访问的元数据字段

列名类型
_metadata.row_id长整型行的唯一标识符。
_metadata.row_commit_version长整型行最后一次插入或更新时的表版本。

读取表时,行 ID 和行提交版本元数据字段不会自动包含在内。相反,这些元数据字段必须从所有 Apache Spark 表中都可用的隐藏 _metadata 列中手动选择。

SELECT _metadata.row_id, _metadata.row_commit_version, * FROM table_name;

可以禁用行跟踪以减少元数据字段的存储开销。禁用行跟踪后,元数据字段仍然可用,但每次操作触及行时,所有行都会被分配一个新的 ID 和提交版本。

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

存在以下限制

  • 读取更改数据流时,无法访问行 ID 和行提交版本元数据字段。
  • 一旦将行跟踪功能添加到表中,就无法在不重新创建表的情况下将其删除。