工作與三角洲湖表的曆史
每個操作,修改一個三角洲湖表創建一個新的表版本。您可以使用曆史信息審核操作,回滾表或查詢一個表在一個特定時間點上使用時間旅行。
請注意
磚不建議使用三角洲湖表作為一個長期的曆史數據歸檔備份解決方案。磚建議隻使用過去7天內上任時間旅行業務的除非你有數據和日誌保留配置設置為一個更大的價值。
檢索三角洲曆史表
您可以檢索信息,包括操作、用戶和時間戳對於每個寫一個三角洲表通過運行曆史
命令。倒序返回的操作。
表曆史保留是由表設置delta.logRetentionDuration
,這是默認30天。
請注意
由不同的保留時間旅行和表曆史控製閾值。看到三角洲湖時間旅行是什麼?。
描述曆史' /數據/事件/ '——得到的全部曆史表描述曆史δ。' /數據/事件/ '描述曆史' /數據/事件/ '限製1——得到最後一個操作描述曆史eventsTable
火花的SQL語法細節,請參閱描述曆史。
看到三角洲湖API文檔Scala / Java / Python語法細節。
數據瀏覽提供了一個可視化視圖的三角洲的詳細表信息和曆史表。除了表模式和樣本數據,你可以點擊曆史選項卡,查看曆史顯示的表描述曆史
。
曆史模式
的輸出曆史
操作有以下列。
列 |
類型 |
描述 |
---|---|---|
版本 |
長 |
表版本生成的操作。 |
時間戳 |
時間戳 |
當這個版本。 |
用戶標識 |
字符串 |
用戶的ID運行操作。 |
用戶名 |
字符串 |
用戶運行操作的名稱。 |
操作 |
字符串 |
操作的名稱。 |
operationParameters |
地圖 |
操作的參數(例如,謂詞)。 |
工作 |
結構體 |
工作的細節操作。 |
筆記本 |
結構體 |
筆記本的操作運行的細節。 |
clusterId |
字符串 |
ID的集群的操作運行。 |
readVersion |
長 |
版本的表讀執行寫操作。 |
isolationLevel |
字符串 |
隔離級別用於此操作。 |
isBlindAppend |
布爾 |
這個操作是否附加數據。 |
operationMetrics |
地圖 |
指標的操作(例如,和文件修改的行數)。 |
userMetadata |
字符串 |
如果是指定用戶定義提交元數據 |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | + | |版本時間戳userId |操作用戶名| | operationParameters | |工作筆記本| clusterId | readVersion | isolationLevel | isBlindAppend | operationMetrics | + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | 5 | 2019-07-29 14:07:47 | # # # # # # | | |刪除(謂詞- > [" (…零| | # # # # # # | | 4 | WriteSerializable假| | (numTotalRows - >…| | 4 | 2019-07-29 14:07:41 | # # # # # # | | |更新(謂詞- > (id…零| | # # # # # # | | 3 | WriteSerializable假| | (numTotalRows - >…| | 3 | 2019-07-29 14:07:29 | # # # # # # | | |刪除(謂詞- > [" (…零| | # # # # # # | | 2 | WriteSerializable假| | (numTotalRows - >…| | 2 | 2019-07-29 14:06:56 | # # # # # # | | |更新(謂詞- > (id…零| | # # # # # # | | 1 | WriteSerializable假| | (numTotalRows - >…| | 1 | 2019-07-29 14:04:31 | # # # # # # | | |刪除(謂詞- > [" (…零| | # # # # # # | 0 | | WriteSerializable假| | (numTotalRows - >…| | 0 | 2019-07-29 14:01:40 | # # # # # # | | |寫[模式- > ErrorIfE……|null| ###| ###| null|WriteSerializable| true|[numFiles -> 2, n...| +-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+
請注意
一些可用的其他列不如果你寫進三角洲表使用以下方法:
列添加在未來將永遠被添加在最後一列。
操作指標的鑰匙
的曆史
操作返回操作指標的集合operationMetrics
列映射。
下麵的表列出了地圖鍵定義的操作。
操作 |
指標名稱 |
描述 |
---|---|---|
寫,創建表選擇,替代選擇表的副本 |
||
numFiles |
寫文件數量。 |
|
numOutputBytes |
大小的字節寫內容。 |
|
numOutputRows |
寫的行數。 |
|
流媒體更新 |
||
numAddedFiles |
文件數量補充道。 |
|
numRemovedFiles |
數量的文件刪除。 |
|
numOutputRows |
寫的行數。 |
|
numOutputBytes |
寫的字節大小。 |
|
刪除 |
||
numAddedFiles |
文件數量補充道。沒有提供在分區表的刪除。 |
|
numRemovedFiles |
數量的文件刪除。 |
|
numDeletedRows |
刪除的行數。沒有提供在分區表的刪除。 |
|
numCopiedRows |
複製的行數的過程中刪除文件。 |
|
executionTimeMs |
整個操作時間執行。 |
|
scanTimeMs |
時間掃描文件匹配。 |
|
rewriteTimeMs |
時間重寫匹配的文件。 |
|
截斷 |
||
numRemovedFiles |
數量的文件刪除。 |
|
executionTimeMs |
整個操作時間執行。 |
|
合並 |
||
numSourceRows |
在源DataFrame的行數。 |
|
numTargetRowsInserted |
插入到目標表的行數。 |
|
numTargetRowsUpdated |
在目標表更新的行數。 |
|
numTargetRowsDeleted |
目標表中刪除的行數。 |
|
numTargetRowsCopied |
目標的行數複製。 |
|
numOutputRows |
總寫的行數。 |
|
numTargetFilesAdded |
數量的文件添加到水槽(目標)。 |
|
numTargetFilesRemoved |
文件數量從水槽中刪除(目標)。 |
|
executionTimeMs |
整個操作時間執行。 |
|
scanTimeMs |
時間掃描文件匹配。 |
|
rewriteTimeMs |
時間重寫匹配的文件。 |
|
更新 |
||
numAddedFiles |
文件數量補充道。 |
|
numRemovedFiles |
數量的文件刪除。 |
|
numUpdatedRows |
更新的行數。 |
|
numCopiedRows |
的行數隻複製在更新文件的過程。 |
|
executionTimeMs |
整個操作時間執行。 |
|
scanTimeMs |
時間掃描文件匹配。 |
|
rewriteTimeMs |
時間重寫匹配的文件。 |
|
FSCK |
numRemovedFiles |
數量的文件刪除。 |
轉換 |
numConvertedFiles |
拚花已經被轉換的文件的數量。 |
優化 |
||
numAddedFiles |
文件數量補充道。 |
|
numRemovedFiles |
文件數量優化。 |
|
numAddedBytes |
添加表優化後的字節數。 |
|
numRemovedBytes |
的字節數。 |
|
minFileSize |
規模最小的文件後,表進行優化。 |
|
p25FileSize |
後第25百分位文件表的大小進行優化。 |
|
p50FileSize |
平均文件大小後表進行優化。 |
|
p75FileSize |
第75個百分位的大小文件後表進行優化。 |
|
maxFileSize |
最大文件的大小後,表進行優化。 |
|
克隆 |
||
sourceTableSize |
源表的大小在字節版本的克隆。 |
|
sourceNumOfFiles |
數量的文件在源表的克隆版。 |
|
numRemovedFiles |
文件數量從目標表中刪除如果表取代了先前的三角洲。 |
|
removedFilesSize |
總大小的字節的文件刪除目標表如果表取代了先前的三角洲。 |
|
numCopiedFiles |
數量的文件複製到新的位置。0為淺克隆。 |
|
copiedFilesSize |
總大小字節的文件複製到新的位置。0為淺克隆。 |
|
恢複 |
||
tableSizeAfterRestore |
表大小的字節後恢複。 |
|
numOfFilesAfterRestore |
表中數量的文件後恢複。 |
|
numRemovedFiles |
恢複刪除的文件操作的數量。 |
|
numRestoredFiles |
被添加的文件數量的恢複。 |
|
removedFilesSize |
大小的字節的文件被還原。 |
|
restoredFilesSize |
大小字節的文件中添加的恢複。 |
|
真空 |
||
numDeletedFiles |
刪除文件的數量。 |
|
numVacuumedDirectories |
真空的目錄。 |
|
numFilesToDelete |
要刪除的文件數量。 |
三角洲湖時間旅行是什麼?
三角洲湖時間旅行支持查詢以前的表版本基於時間戳或表版本(在事務日誌記錄)。您可以使用時間旅行應用程序如以下:
重新創建分析、報告、或輸出(例如,機器學習模型)的輸出。這對調試或審計可能是有用的,尤其是在監管的行業。
編寫複雜的時態查詢。
在您的數據修複錯誤。
為一組提供快照隔離快速變化的表的查詢。
重要的
表版本可以時間旅行是由一個事務日誌文件保留閾值和指定的頻率和保留真空
操作。如果你運行真空
日常使用默認值,可用的數據是7天時間旅行。
三角洲時間旅行的語法
你查詢一個增量表時間旅行表名後增加一個條款規範。
timestamp_expression
可以是任何一個:2018 - 10 - 18 t22:15:12.013z
,也就是說,可以把一個字符串,該字符串轉換為一個時間戳鑄造(' 2018-10-1813:36:32c '作為時間戳)
“2018-10-18”
,也就是說,一個日期字符串current_timestamp ()- - - - - -時間間隔12小時
date_sub(當前日期(),1)
其他表達式,也可以把一個時間戳
版本
是一個長期的價值,可以獲得輸出的嗎描述曆史table_spec
。
既不timestamp_expression
也不版本
子查詢。
隻接受日期或時間戳字符串。例如,“2019-01-01”
和“2019 - 01 - 01 t00:00:00.000z”
。看下麵的代碼例如語法:
選擇*從people10m時間戳作為的2018 - 10 - 18 t22:15:12.013z選擇*從δ。' /tmp/δ/people10m”版本作為的123年
df1=火花。讀。選項(“timestampAsOf”,“2019-01-01”)。表(“people10m”)df2=火花。讀。選項(“versionAsOf”,123年)。負載(“/ tmp /δ/ people10m”)
您還可以使用@
語法來指定時間戳或版本的表名。必須在時間戳yyyyMMddHHmmssSSS
格式。您可以指定一個版本@
通過將一個v
的版本。看下麵的代碼例如語法:
選擇*從people10m@20190101000000000選擇*從people10m@v123
火花。讀。表(“people10m@20190101000000000”)火花。讀。表(“people10m@v123”)火花。讀。負載(“/ tmp /δ/ people10m@20190101000000000”)火花。讀。負載(“/ tmp /δ/ people10m@v123”)
事務日誌檢查點是什麼?
三角洲湖表版本為JSON文件中的記錄_delta_log
目錄,這是存儲在表的數據。優化查詢、檢查站三角洲湖總量表版本鋪檢查點文件,防止需要閱讀所有的JSON版本表的曆史。磚優化檢查點頻率數據的大小和工作負載。用戶應該不需要直接與檢查點。檢查點頻率可隨時更改,不另行通知。
配置數據保留時間旅行的查詢
查詢之前的表格版本,你必須保留這兩個的日誌和數據文件的版本。
數據文件被刪除時真空
對一個表運行。三角洲湖管理日誌文件刪除後自動檢查點表版本。
因為大多數三角洲表真空
定期與他們,應該尊重保留閾值時間點查詢真空
默認情況下,這是7天。
為了增加數據保留閾值δ表,您必須配置以下表屬性:
delta.logRetentionDuration=“間隔<時間>”
:控製表的曆史保存多久。默認值是時間間隔30.天
。delta.deletedFileRetentionDuration=“間隔<時間>”
:確定閾值真空
用來刪除數據文件不再當前表中引用的版本。默認值是時間間隔7天
。
您可以指定δ在表創建或設置它們的屬性改變表
聲明。看到三角洲表屬性引用。
請注意
您必須設置這兩個屬性,以確保表曆史保留更長時間與頻繁的表真空
操作。例如,曆史數據集的訪問30天delta.deletedFileRetentionDuration=“間隔30.天”
(匹配的默認設置delta.logRetentionDuration
)。
增加存儲數據保留閾值會導致成本上升,隨著越來越多的數據文件。
恢複一個增量表的狀態
請注意
在磚運行時7.4及以上。
你可以恢複一個增量表通過使用其先前的狀態恢複
命令。δ表內部維護曆史版本的表,使它恢複到早期狀態。之前版本對應狀態或時間戳的早些時候的狀態創建支持的選項恢複
命令。
重要的
你可以恢複已經恢複的表。
你可以恢複克隆表。
你必須有
修改
允許在桌子上被恢複。你不能一個表恢複到一個舊版本的數據文件被刪除手動或通過
真空
。恢複這個版本部分仍然是可能的spark.sql.files.ignoreMissingFiles
被設置為真正的
。時間戳格式恢複的狀態
yyyy-MM-ddHH: mm: ss
。隻提供一個日期(yyyy-MM-dd
還支持)字符串。
恢複表db。target_table來版本作為的<版本>恢複表δ。' /數據/目標/ '來時間戳作為的<時間戳>
語法細節,請參閱恢複。
重要的
恢複是一個數據修改操作。三角洲湖日誌條目的添加恢複
命令包含dataChange設置為true。如果有一個下遊應用程序,例如結構化流工作流程對三角洲湖表的更新,改變日誌條目添加的數據恢複操作是新數據更新,可能會導致重複的數據和處理它們。
例如:
表版本 |
操作 |
三角洲日誌更新 |
記錄在數據更改日誌更新 |
---|---|---|---|
0 |
插入 |
AddFile(/路徑/ /文件1,dataChange = true) |
(name =維克多,= 29歲(name =喬治,年齡= 55) |
1 |
插入 |
AddFile(/路徑/ /文件2,dataChange = true) |
(name =喬治,年齡= 39) |
2 |
優化 |
AddFile(/路徑/ / file-3 dataChange = false), RemoveFile(/道路/ /文件1)RemoveFile路徑(/ / /文件2) |
(沒有記錄作為優化壓實不會改變表中的數據) |
3 |
恢複(version = 1) |
RemoveFile(/道路/ / file-3), AddFile(/路徑/ /文件1,dataChange = true), AddFile(/路徑/ /文件2,dataChange = true) |
(name =維克多,年齡= 29),(name =喬治,年齡= 55),(name =喬治,年齡= 39) |
在前麵的例子中,恢複
命令的結果更新已經看到當閱讀三角洲表版本0和1。如果流媒體查詢是閱讀此表,那麼這些文件將被視為新添加的數據和處理。
恢複指標
請注意
在磚運行時8.2及以上。
恢複
報告以下指標作為一個單獨的行DataFrame操作完成後:
table_size_after_restore
:恢複後表的大小。num_of_files_after_restore
:表中的文件恢複後的數量。num_removed_files
:文件數量從表中刪除(邏輯刪除)。num_restored_files
:由於回滾文件數量恢複。removed_files_size
:總大小字節的文件從表中刪除。restored_files_size
:總大小字節的文件恢複。
使用三角洲湖時間旅行的例子
為用戶解決意外刪除一個表
111年
:插入成my_table選擇*從my_table時間戳作為的date_sub(當前日期(),1)在哪裏用戶標識=111年
解決意外錯誤更新一個表:
合並成my_table目標使用my_table時間戳作為的date_sub(當前日期(),1)源在源。用戶標識=目標。用戶標識當匹配然後更新集*
查詢添加新客戶的數量在過去的一周。beplay体育app下载地址
選擇數(截然不同的用戶標識)從my_table- - - - - -(選擇數(截然不同的用戶標識)從my_table時間戳作為的date_sub(當前日期(),7))
我怎麼找到最後一個提交的版本火花會話嗎?
得到最後的版本號提交當前寫的SparkSession
在所有線程和所有表、查詢SQL配置spark.databricks.delta.lastCommitVersionInSession
。
集火花。磚。δ。lastCommitVersionInSession
火花。相依。得到(“spark.databricks.delta.lastCommitVersionInSession”)
火花。相依。得到(“spark.databricks.delta.lastCommitVersionInSession”)
如果沒有提交的SparkSession
、查詢返回一個空值的關鍵。
請注意
如果你共享相同的SparkSession
在多個線程,它類似於跨多個線程共享變量;你可能打擊競態條件的並發更新配置值。