为 Delta 表使用行跟踪
行跟踪允许 Delta Lake 跟踪 Delta Lake 表中的行级血缘。在 Delta Lake 表上启用行跟踪后,表会添加两个新的元数据字段
- 行 ID 为行提供在表中唯一的标识符。使用 MERGE或UPDATE语句修改行时,行会保持相同的 ID。
- 行提交版本记录了行被修改时表的最后一个版本。使用 MERGE或UPDATE语句修改行时,行会被分配一个新的版本。
启用行跟踪
标题为“启用行跟踪”的部分您必须使用以下方法之一显式启用行跟踪
- 新表:在 CREATE TABLE命令中设置表属性delta.enableRowTracking = true。
-- Create an empty tableCREATE TABLE student (id INT, name STRING, age INT)TBLPROPERTIES ('delta.enableRowTracking' = 'true');
-- Using a CTAS statementCREATE TABLE course_newTBLPROPERTIES ('delta.enableRowTracking' = 'true')AS SELECT * FROM course_old;
-- Using a LIKE statement to copy configurationCREATE TABLE graduate LIKE student;
-- Using a CLONE statement to copy configurationCREATE 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;spark.conf.set("spark.databricks.delta.properties.defaults.enableRowTracking", True)spark.conf.set("spark.databricks.delta.properties.defaults.enableRowTracking", true)行跟踪存储
标题为“行跟踪存储”的部分启用行跟踪可能会增加表的大小。Delta Lake 将行跟踪元数据字段存储在数据文件中的隐藏元数据列中。某些操作,例如仅插入操作,不使用这些隐藏列,而是使用 Delta Lake 日志中的元数据来跟踪行 ID 和行提交版本。数据重组操作(例如 OPTIMIZE 和 REORG)会导致使用隐藏元数据列跟踪行 ID 和行提交版本,即使它们以前是使用元数据存储的。
读取行跟踪元数据字段
标题为“读取行跟踪元数据字段”的部分行跟踪添加了以下可在读取表时访问的元数据字段
| 列名 | 类型 | 值 | 
|---|---|---|
| _metadata.row_id | 长整型 | 行的唯一标识符。 | 
| _metadata.row_commit_version | 长整型 | 行最后一次插入或更新时的表版本。 | 
读取表时,行 ID 和行提交版本元数据字段不会自动包含在内。相反,这些元数据字段必须从所有 Apache Spark 表中都可用的隐藏 _metadata 列中手动选择。
SELECT _metadata.row_id, _metadata.row_commit_version, * FROM table_name;spark.read.table("table_name") \  .select("_metadata.row_id", "_metadata.row_commit_version", "*")spark.read.table("table_name")  .select("_metadata.row_id", "_metadata.row_commit_version", "*")禁用行跟踪
标题为“禁用行跟踪”的部分可以禁用行跟踪以减少元数据字段的存储开销。禁用行跟踪后,元数据字段仍然可用,但每次操作触及行时,所有行都会被分配一个新的 ID 和提交版本。
ALTER TABLE table_name SET TBLPROPERTIES (delta.enableRowTracking = false);spark.sql("ALTER TABLE table_name SET TBLPROPERTIES (delta.enableRowTracking = false)")spark.sql("ALTER TABLE table_name SET TBLPROPERTIES (delta.enableRowTracking = false)")存在以下限制
- 读取更改数据流时,无法访问行 ID 和行提交版本元数据字段。
- 一旦将行跟踪功能添加到表中,就无法在不重新创建表的情况下将其删除。