更改數據提要
筆記
DELTA更改數據feed可在Databricks運行時8.4及以上提供。
本文介紹了如何使用更改數據提要功能來記錄和查詢三角洲表的行級別更改信息。要了解如何根據源數據的更改來更新三角洲實時表管道中的表格,請參見使用三角洲實時表更改數據捕獲。
更改數據提要(CDF)功能允許三角洲表跟蹤三角洲表版本之間的行級更改。當在增量表上啟用時,運行時記錄了所有寫入表中的數據的“更改事件”。這包括行數據以及元數據,指示是否插入,刪除或更新指定的行。
您可以使用SQL和DataFrame API讀取批次查詢中的更改事件(即,DF.Read
),以及使用DataFrame API的流詢問(也就是說,DF.Readstream
)。
用例
默認情況下不啟用更改數據供稿。啟用更改數據提要時,以下用例應驅動。
銀和金桌:通過僅處理初始後的行級變更來提高增量性能
合並
,,,,更新
, 或者刪除
加速和簡化ETL和ELT操作的操作。物有意見:創建最新的,彙總的信息視圖,以用於BI和分析,而無需重新處理完整的基礎表,而僅在更改進行的地方更新。
傳輸變化:向下遊係統(例如KAFKA或RDBMS)發送更改數據FEED,這些係統可以使用它在數據管道的後期階段進行逐步處理。
審計蹤跡表:捕獲更改數據feed作為三角洲表提供永久存儲和有效的查詢功能,以查看隨著時間的流逝,包括刪除何時發生以及進行了哪些更新。
啟用更改數據提要
您必須使用以下方法之一明確啟用更改數據提要選項:
新表:設置表屬性
delta.enablechangedatafeed=真的
在裏麵創造桌子
命令。創造桌子學生((IDint,,,,姓名細繩,,,,年齡int)tblproperties((三角洲。enablechangedatafeed=真的)
現有表:設置表屬性
delta.enablechangedatafeed=真的
在裏麵改變桌子
命令。改變桌子MyDeltaTap放tblproperties((三角洲。enablechangedatafeed=真的)
所有新桌子:
放火花。數據映。三角洲。特性。默認。enablechangedatafeed=真的;
重要的
一旦啟用了表格的更改數據供稿選項,就無法使用Databricks運行時8.1或以下寫入表。您可以隨時閱讀表。
隻有更改後您可以記錄更改數據供稿;過去的更改未捕獲。
更改數據存儲
Databricks記錄更改數據更新
,,,,刪除
, 和合並
操作_change_data
Delta表目錄下方的文件夾。當Databricks檢測到可以直接從事務日誌中直接計算更改數據時,可能會跳過這些記錄。特別是,僅插入操作和完整分區刪除將不會在該數據中生成數據_change_data
目錄。
文件中的文件_change_data
文件夾遵循表的保留政策。因此,如果您運行真空命令,更改數據提要數據也已刪除。
閱讀批次查詢中的更改
您可以為開始和結束提供版本或時間戳。開始版本和時間戳在查詢中包含在內。讀取從特定起始版本到的更改最新的該表的版本,僅指定起始版本或時間戳。
您將版本指定為整數和時間戳為格式中的字符串yyyy-mm-dd [HH:MM:SS [.sss]]
。
如果您提供的版本比記錄更改事件的版本更低或年齡較低的版本,也就是說,當啟用更改數據供稿時,會引發錯誤,以表明未啟用更改數據feed。
- 版本為ints或longs,例如從版本0到10的更改選擇*從table_changes(('tablename',,,,0,,,,10)- 時間戳為字符串格式的時間戳選擇*從table_changes(('tablename',,,,'2021-04-21 05:45:46',,,,'2021-05-21 12:00:00')- 僅提供啟動時間/時間戳選擇*從table_changes(('tablename',,,,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')
#版本為ints或longs火花。讀。格式((“三角洲”)\ \。選項((“ ReadChangeFeed”,,,,“真的”)\ \。選項((“起點”,,,,0)\ \。選項((“ Endingversion”,,,,10)\ \。桌子((“ MyDeltatable”)#Timestamps作為格式的時間戳火花。讀。格式((“三角洲”)\ \。選項((“ ReadChangeFeed”,,,,“真的”)\ \。選項((“起始Timestamp”,,,,'2021-04-21 05:45:46')\ \。選項((“ EndingTimestamp”,,,,'2021-05-21 12:00:00')\ \。桌子((“ MyDeltatable”)#僅提供啟動時間/時間戳火花。讀。格式((“三角洲”)\ \。選項((“ ReadChangeFeed”,,,,“真的”)\ \。選項((“起點”,,,,0)\ \。桌子((“ MyDeltatable”)#基於路徑的表火花。讀。格式((“三角洲”)\ \。選項((“ ReadChangeFeed”,,,,“真的”)\ \。選項((“起始Timestamp”,,,,'2021-04-21 05:45:46')\ \。加載((“路徑延伸”)
//版本為ints或longs火花。讀。格式((“三角洲”)。選項((“ ReadChangeFeed”,,,,“真的”)。選項((“起點”,,,,0)。選項((“ Endingversion”,,,,10)。桌子((“ MyDeltatable”)//時間戳作為格式的時間戳火花。讀。格式((“三角洲”)。選項((“ ReadChangeFeed”,,,,“真的”)。選項((“起始Timestamp”,,,,“ 2021-04-21 05:45:46”)。選項((“ EndingTimestamp”,,,,“ 2021-05-21 12:00:00”)。桌子((“ MyDeltatable”)//僅提供啟動/時間戳火花。讀。格式((“三角洲”)。選項((“ ReadChangeFeed”,,,,“真的”)。選項((“起點”,,,,0)。桌子((“ MyDeltatable”)//基於路徑的表火花。讀。格式((“三角洲”)。選項((“ ReadChangeFeed”,,,,“真的”)。選項((“起始Timestamp”,,,,“ 2021-04-21 05:45:46”)。加載((“路徑延伸”)
閱讀流質查詢的更改
#提供起始版本火花。readstream。格式((“三角洲”)\ \。選項((“ ReadChangeFeed”,,,,“真的”)\ \。選項((“起點”,,,,0)\ \。桌子((“ MyDeltatable”)#提供開始時間戳火花。readstream。格式((“三角洲”)\ \。選項((“ ReadChangeFeed”,,,,“真的”)\ \。選項((“起始Timestamp”,,,,“ 2021-04-21 05:35:43”)\ \。加載((“/途徑可造成的”)#不提供啟動版/時間戳將導致最新的快照首先獲取火花。readstream。格式((“三角洲”)\ \。選項((“ ReadChangeFeed”,,,,“真的”)\ \。桌子((“ MyDeltatable”)
//提供起始版本火花。readstream。格式((“三角洲”)。選項((“ ReadChangeFeed”,,,,“真的”)。選項((“起點”,,,,0)。桌子((“ MyDeltatable”)//提供起始時間戳火花。readstream。格式((“三角洲”)。選項((“ ReadChangeFeed”,,,,“真的”)。選項((“起點”,,,,“ 2021-04-21 05:35:43”)。加載((“/途徑可造成的”)//不提供啟動版/時間戳將導致最新快照首先獲取火花。readstream。格式((“三角洲”)。選項((“ ReadChangeFeed”,,,,“真的”)。桌子((“ MyDeltatable”)
要在閱讀表格時獲取更改數據,請設置選項ReadChangeFeed
至真的
。這起點
或者開始Timestamp
是可選的,如果未提供的話,流將在流媒體時返回表的最新快照插入
以及未來的變化作為變更數據。諸如費率限製之類的選項(maxfilespertrigger
,,,,maxbytespertrigger
) 和排除
閱讀更改數據時也得到支持。
筆記
對於啟動快照版本以外的版本,限製速率可能是原子。也就是說,整個提交版本將受到限製,否則將返回整個提交版本。
更改數據事件模式
除了數據列外,更改數據還包含確定變更事件類型的元數據列:
列名 |
類型 |
值 |
---|---|---|
|
細繩 |
|
|
長 |
包含更改的Delta日誌或表版本。 |
|
時間戳 |
創建提交時的時間戳關聯。 |
(1)預先形象
是更新之前的值,後圖像
是更新後的值。