改變數據提要
請注意
Delta更改數據提要在Databricks Runtime 8.4及以上版本中可用。
本文描述如何使用更改數據提要特性記錄和查詢Delta表的行級更改信息。要了解如何根據源數據的更改更新Delta Live tables管道中的表,請參見使用Delta Live表更改數據捕獲.
更改數據提要(Change Data Feed, CDF)特性允許增量表跟蹤增量表版本之間的行級更改。當在Delta表上啟用時,運行時記錄寫入表的所有數據的“更改事件”。這包括行數據以及指示是否插入、刪除或更新指定行的元數據。
您可以使用SQL和DataFrame api(即,df.read
),以及使用DataFrame api的流查詢(即,df.readStream
).
用例
“更改數據提要”默認不啟用。當您啟用變更數據提要時,以下用例應該驅動。
銀桌和金桌:通過隻處理初始化後的行級更改來提高Delta性能
合並
,更新
,或刪除
以加速和簡化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
文件夾在Delta表目錄下。當Databricks檢測到它可以直接從事務日誌有效地計算更改數據feed時,可以跳過這些記錄。特別是,僅插入操作和完整分區刪除不會在_change_data
目錄中。
的文件_change_data
文件夾遵循表的保留策略。因此,如果運行真空命令中,更改數據feed的數據也被刪除。
讀取批處理查詢中的更改
可以為開始和結束提供版本或時間戳。查詢中包含開始和結束版本以及時間戳。從特定的開始版本讀取更改到最新的表的版本,隻指定起始版本或時間戳。
將版本指定為整數,將時間戳指定為如下格式的字符串yyyy-MM-dd [HH: mm: ss(。SSS]]
.
如果您提供的版本比記錄變更事件的版本更低或更早,也就是說,當啟用變更數據提要時,將拋出一個錯誤,指示未啟用變更數據提要。
——版本為int或long類型,例如從版本0更改為10選擇*從table_changes(“表”,0,10)——timestamp作為字符串格式的時間戳選擇*從table_changes(“表”,“2021-04-21 05:45:46”,“2021-05-21 12:00:00”)——隻提供startingVersion/時間戳選擇*從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”)
# version為int或long類型火花.讀.格式(“δ”)\.選項(“readChangeFeed”,“真正的”)\.選項(“startingVersion”,0)\.選項(“endingVersion”,10)\.表格(“myDeltaTable”)#格式化的時間戳火花.讀.格式(“δ”)\.選項(“readChangeFeed”,“真正的”)\.選項(“startingTimestamp”,“2021-04-21 05:45:46”)\.選項(“endingTimestamp”,“2021-05-21 12:00:00”)\.表格(“myDeltaTable”)#隻提供開始版本/時間戳火花.讀.格式(“δ”)\.選項(“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
將拋出。如果用戶將以下配置設置為,CDF可以處理超出範圍的版本情況真正的
.
集火花.磚.δ.changeDataFeed.timestampOutOfRange.啟用=真正的;
如果您提供的啟動版本大於表上最後一次提交的版本,或者啟動時間戳比表上最後一次提交的時間戳新,那麼在啟用上述配置時,將返回一個空的讀結果。
如果您提供的結束版本大於表上最後一次提交的版本,或者結束時間戳比表上最後一次提交的時間戳新,那麼在批處理讀取模式下啟用上述配置時,將返回開始版本和最後一次提交之間的所有更改。
更改數據事件模式
除了數據列之外,變更數據還包含標識變更事件類型的元數據列:
列名 |
類型 |
值 |
---|---|---|
|
字符串 |
|
|
長 |
包含更改的Delta日誌或表版本。 |
|
時間戳 |
創建提交時關聯的時間戳。 |
(1)像原
為更新前的值,postimage
更新後的值。