在Databricks上使用Delta Lake更改数据提要

请注意

  • Delta Lake更改数据提要可在Databricks Runtime 8.4及以上版本中使用。

  • 本文描述如何使用更改数据提要特性记录和查询Delta表的行级更改信息。若要了解如何根据源数据的更改更新Delta Live tables管道中的表,请参见使用Delta Live表更改数据捕获

更改数据提要允许Databricks跟踪Delta表版本之间的行级更改。当在Delta表上启用时,运行时记录更改事件对于所有写入表的数据。这包括行数据以及元数据,这些元数据指示是否插入、删除或更新了指定的行。

您可以使用Spark SQL、Apache Spark DataFrames和Structured Streaming在批查询中读取更改事件。

重要的

更改数据提要与表历史一起工作,以提供更改信息。因为克隆一个Delta表会创建一个单独的历史,所以克隆表上的更改数据提要与原始表的更改数据提要不匹配。

用例

默认情况下,更改数据提要不启用。当您启用变更数据提要时,以下用例应该会驱动。

  • 银桌和金桌:通过只处理初始化后的行级更改来提高Delta Lake性能合并更新,或删除以加速和简化ETL和ELT操作。

  • 物化视图:创建用于BI和分析的最新的聚合信息视图,而无需重新处理完整的底层表,只需在发生更改的地方更新。

  • 传输变化:向下游系统(如Kafka或RDBMS)发送更改数据提要,以便在数据管道的后期阶段使用它进行增量处理。

  • 审计跟踪表:捕获更改数据提要,Delta表提供永久存储和高效的查询功能,以查看随时间变化的所有更改,包括删除发生的时间和更新的内容。

启用变更数据提要

您必须使用以下方法之一显式启用更改数据提要选项:

  • 新表:设置table属性delta.enableChangeDataFeed真正的创建表格命令。

    创建表格学生idINT的名字字符串年龄INTTBLPROPERTIESδenableChangeDataFeed真正的
  • 现有表:设置table属性delta.enableChangeDataFeed真正的改变表格命令。

    改变表格myDeltaTableTBLPROPERTIESδenableChangeDataFeed真正的
  • 所有新表

    火花δ属性违约enableChangeDataFeed真正的

重要的

  • 一旦为表启用了更改数据提要选项,就不能再使用Databricks Runtime 8.1或以下版本向表写入数据。你可以看表格。

只做了更改您启用的变更数据均被记录;不捕获对表的过去更改。

更改数据存储

Databricks记录更改数据更新删除,合并操作_change_data表目录下的文件夹。某些操作,如仅插入操作和全分区删除,不会在_change_data因为Databricks可以直接从事务日志有效地计算更改数据提要。

文件在_change_data文件夹遵循表的保留策略。因此,如果运行真空命令,更改数据提要数据也被删除。

读取批处理查询中的更改

您可以为开始和结束提供版本或时间戳。查询中包括开始和结束版本以及时间戳。来读取从特定起始版本到最新的表的版本,只指定起始版本或时间戳。

将版本指定为整数,将时间戳指定为格式中的字符串yyyy-MM-dd [HH: mm: ss(。SSS]]

如果您提供的版本较低或时间戳比已记录变更事件的版本更早(即启用变更数据提要时),则会抛出一个错误,指示未启用变更数据提要。

——版本为整型或长型,例如从版本0到版本10选择table_changes“表”010——时间戳为字符串格式的时间戳选择table_changes“表”“2021-04-21 05:45:46”“2021-05-21 12:00:00”——只提供startingVersion/timestamp选择table_changes“表”0——数据库/模式名在字符串中作为表名,反勾用于转义圆点和特殊字符选择table_changesdbName. dotted.tableName”“2021-04-21 06:45:46”“2021-05-21 12:00:00”——基于路径的表选择table_changes_by_path“\路径”“2021-04-21 05:45:46”
#版本为int或long火花格式“δ”选项“readChangeFeed”“真正的”选项“startingVersion”0选项“endingVersion”10表格“myDeltaTable”#格式化的时间戳火花格式“δ”选项“readChangeFeed”“真正的”选项“startingTimestamp”“2021-04-21 05:45:46”选项“endingTimestamp”“2021-05-21 12:00:00”表格“myDeltaTable”#只提供startingVersion/timestamp火花格式“δ”选项“readChangeFeed”“真正的”选项“startingVersion”0表格“myDeltaTable”#基于路径的表火花格式“δ”选项“readChangeFeed”“真正的”选项“startingTimestamp”“2021-04-21 05:45:46”负载“pathToMyDeltaTable”
//版本为int或long火花格式“δ”选项“readChangeFeed”“真正的”选项“startingVersion”0选项“endingVersion”10表格“myDeltaTable”//格式化的时间戳火花格式“δ”选项“readChangeFeed”“真正的”选项“startingTimestamp”“2021-04-21 05:45:46”选项“endingTimestamp”“2021-05-21 12:00:00”表格“myDeltaTable”//只提供startingVersion/时间戳火花格式“δ”选项“readChangeFeed”“真正的”选项“startingVersion”0表格“myDeltaTable”//基于路径的表火花格式“δ”选项“readChangeFeed”“真正的”选项“startingTimestamp”“2021-04-21 05:45:46”负载“pathToMyDeltaTable”

读取流查询中的更改

#提供一个起始版本火花readStream格式“δ”选项“readChangeFeed”“真正的”选项“startingVersion”0表格“myDeltaTable”#提供一个开始时间戳火花readStream格式“δ”选项“readChangeFeed”“真正的”选项“startingTimestamp”“2021-04-21 05:35:43”负载“/ pathToMyDeltaTable”#不提供起始版本/时间戳将导致最先获取最新的快照火花readStream格式“δ”选项“readChangeFeed”“真正的”表格“myDeltaTable”
//提供一个起始版本火花readStream格式“δ”选项“readChangeFeed”“真正的”选项“startingVersion”0表格“myDeltaTable”//提供起始时间戳火花readStream格式“δ”选项“readChangeFeed”“真正的”选项“startingVersion”“2021-04-21 05:35:43”负载“/ pathToMyDeltaTable”//不提供起始版本/时间戳将导致最先获取最新的快照火花readStream格式“δ”选项“readChangeFeed”“真正的”表格“myDeltaTable”

若要在读取表时获得更改数据,请设置该选项readChangeFeed真正的.的startingVersionstartingTimestamp是可选的,如果没有提供流返回表的最新快照在流作为插入未来随着数据的变化而变化。费率限制(maxFilesPerTriggermaxBytesPerTrigger),excludeRegex在读取更改数据时也支持。

请注意

对于起始快照版本以外的版本,速率限制可以是原子的。也就是说,整个提交版本将受到速率限制,或者整个提交将被返回。

默认情况下,如果用户传递的版本或时间戳超过表上的最后一次提交,则错误timestampGreaterThanLatestCommit抛出。如果用户将以下配置设置为,则更改数据提要可以处理超出范围的版本情况真正的

火花δchangeDataFeedtimestampOutOfRange启用真正的

如果您提供的开始版本大于表上的最后一次提交,或者开始时间戳比表上的最后一次提交更新,那么当启用上述配置时,将返回一个空的读结果。

如果您提供的结束版本大于表上的最后一次提交,或者结束时间戳比表上的最后一次提交更新,那么当在批读模式下启用上述配置时,将返回开始版本和最后一次提交之间的所有更改。

变更数据提要的模式是什么?

当您从表的更改数据提要中读取数据时,将使用表最新版本的模式。

请注意

完全支持大多数模式更改和进化操作。启用了列映射的表不支持所有用例,并演示不同的行为。看到更改启用列映射的表的数据提要限制

除了Delta表模式中的数据列外,更改数据提要还包含标识更改事件类型的元数据列:

列名

类型

_change_type

字符串

插入update_preimageupdate_postimage删除(1)

_commit_version

包含更改的增量日志或表版本。

_commit_timestamp

时间戳

创建提交时关联的时间戳。

(1)像原是更新前的值,postimage更新后的值。

请注意

如果模式包含与这些添加的列名称相同的列,则不能在表上启用更改数据提要。在尝试启用更改数据提要之前,重命名表中的列以解决此冲突。

更改启用列映射的表的数据提要限制

在Delta表上启用列映射后,可以删除或重命名表中的列,而无需为现有数据重写数据文件。启用列映射后,在执行非添加式模式更改(如重命名或删除列、更改数据类型或可空性更改)之后,更改数据提要将受到限制。

重要的

在所有Databricks运行时版本中,启用了列映射的表不支持对更改数据提要进行流式读取。

列映射所指示的更改不会在更改数据提要中捕获。无法读取发生非添加性模式更改的事务或范围的更改数据提要。

在Databricks Runtime 12.0及以下版本中,无法读取启用了列映射的表的更改数据提要,这些表经历了列重命名或删除。

在Databricks Runtime 12.1及以上版本中,您可以对启用了列映射的表的更改数据提要执行批处理读取,这些表经历了非添加性的模式更改。读取操作使用查询中指定的表的最终版本的模式,而不是使用表的最新版本的模式。如果指定的版本范围跨越了非加性架构更改,查询仍然会失败。

常见问题(FAQ)

启用变更数据提要的开销是什么?

没有重大影响。更改数据记录在查询执行过程中生成,通常比重写文件的总大小小得多。

变更记录的保留政策是什么?

更改记录遵循与过期表版本相同的保留策略,如果它们超出了指定的保留期限,则将通过VACUUM清理。

变更数据提要中的新记录什么时候可用?

变更数据与Delta Lake事务一起提交,并将与表中的新数据同时可用。

笔记本

这个笔记本显示了如何传播的变化,一个银表的绝对数量的疫苗接种到一个金表的疫苗接种率。

更改数据输入笔记本

在新标签页打开笔记本