在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,的名字字符串,年龄INT)TBLPROPERTIES(δ.enableChangeDataFeed=真正的)
现有表:设置table属性
delta.enableChangeDataFeed=真正的
在改变表格
命令。改变表格myDeltaTable集TBLPROPERTIES(δ.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(“表”,0,10)——时间戳为字符串格式的时间戳选择*从table_changes(“表”,“2021-04-21 05:45:46”,“2021-05-21 12:00:00”)——只提供startingVersion/timestamp选择*从table_changes(“表”,0)——数据库/模式名在字符串中作为表名,反勾用于转义圆点和特殊字符选择*从table_changes(dbName. 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
来真正的
.的startingVersion
或startingTimestamp
是可选的,如果没有提供流返回表的最新快照在流作为插入
未来随着数据的变化而变化。费率限制(maxFilesPerTrigger
,maxBytesPerTrigger
),excludeRegex
在读取更改数据时也支持。
请注意
对于起始快照版本以外的版本,速率限制可以是原子的。也就是说,整个提交版本将受到速率限制,或者整个提交将被返回。
默认情况下,如果用户传递的版本或时间戳超过表上的最后一次提交,则错误timestampGreaterThanLatestCommit
抛出。如果用户将以下配置设置为,则更改数据提要可以处理超出范围的版本情况真正的
.
集火花.砖.δ.changeDataFeed.timestampOutOfRange.启用=真正的;
如果您提供的开始版本大于表上的最后一次提交,或者开始时间戳比表上的最后一次提交更新,那么当启用上述配置时,将返回一个空的读结果。
如果您提供的结束版本大于表上的最后一次提交,或者结束时间戳比表上的最后一次提交更新,那么当在批读模式下启用上述配置时,将返回开始版本和最后一次提交之间的所有更改。
变更数据提要的模式是什么?
当您从表的更改数据提要中读取数据时,将使用表最新版本的模式。
请注意
完全支持大多数模式更改和进化操作。启用了列映射的表不支持所有用例,并演示不同的行为。看到更改启用列映射的表的数据提要限制.
除了Delta表模式中的数据列外,更改数据提要还包含标识更改事件类型的元数据列:
列名 |
类型 |
值 |
---|---|---|
|
字符串 |
|
|
长 |
包含更改的增量日志或表版本。 |
|
时间戳 |
创建提交时关联的时间戳。 |
(1)像原
是更新前的值,postimage
更新后的值。
请注意
如果模式包含与这些添加的列名称相同的列,则不能在表上启用更改数据提要。在尝试启用更改数据提要之前,重命名表中的列以解决此冲突。
更改启用列映射的表的数据提要限制
在Delta表上启用列映射后,可以删除或重命名表中的列,而无需为现有数据重写数据文件。启用列映射后,在执行非添加式模式更改(如重命名或删除列、更改数据类型或可空性更改)之后,更改数据提要将受到限制。
重要的
在所有Databricks运行时版本中,启用了列映射的表不支持对更改数据提要进行流式读取。
列映射所指示的更改不会在更改数据提要中捕获。无法读取发生非添加性模式更改的事务或范围的更改数据提要。
在Databricks Runtime 12.0及以下版本中,无法读取启用了列映射的表的更改数据提要,这些表经历了列重命名或删除。
在Databricks Runtime 12.1及以上版本中,您可以对启用了列映射的表的更改数据提要执行批处理读取,这些表经历了非添加性的模式更改。读取操作使用查询中指定的表的最终版本的模式,而不是使用表的最新版本的模式。如果指定的版本范围跨越了非加性架构更改,查询仍然会失败。