表實用程序命令
Delta表支持許多實用命令。
刪除Delta表不再引用的文件
命令可以刪除Delta表不再引用且超過保留閾值的文件真空
命令放在桌子上。真空
不會自動觸發。缺省情況下,文件的保留閾值為7天。要更改此行為,請參見數據保留.
重要的
請注意
當啟用Delta緩存時,集群可能包含已刪除的Parquet文件中的數據真空
.因此,可以查詢文件已被刪除的以前表版本的數據。重新啟動集群將刪除緩存的數據。看到配置Delta緩存.
真空eventsTable——真空文件不需要的版本比默認保留期真空“/數據/事件”——清空基於路徑的表中的文件真空δ.' /數據/事件/ '真空δ.' /數據/事件/ '保留One hundred.小時—對超過100小時的版本不需要的文件進行真空處理真空eventsTable幹運行——做演練,獲取要刪除的文件列表
有關Spark SQL語法的詳細信息,請參見
請注意
Python API在Databricks Runtime 6.1及以上版本中可用。
從delta.tables進口*deltaTable=DeltaTable.forPath(火花,pathToTable)#基於路徑的表,或者deltaTable=DeltaTable.forName(火花,的表)# Hive基於metastore的表deltaTable.真空()# vacuum文件對於低於默認保留期的版本不需要deltaTable.真空(One hundred.)#真空文件不需要的版本超過100小時
請注意
Scala API在Databricks Runtime 6.0及以上版本中可用。
進口io.δ.表._瓦爾deltaTable=DeltaTable.forPath(火花,pathToTable)deltaTable.真空()//在默認保留期之前的版本不需要真空文件deltaTable.真空(One hundred.)//清理文件不需要的版本超過100小時
請注意
Java API在Databricks Runtime 6.0及以上版本中可用。
進口io.delta.tables。*;進口org.apache.spark.sql.functions;DeltaTabledeltaTable=DeltaTable.forPath(火花,pathToTable);deltaTable.真空();//在默認保留期之前的版本不需要真空文件deltaTable.真空(One hundred.);//清理文件不需要的版本超過100小時
看到三角洲湖api針對Scala, Java和Python的語法細節。
警告
建議您將保留間隔設置為至少7天,因為舊的快照和未提交的文件仍然可以被表的並發讀取者或寫入者使用。如果真空
清理活動文件時,並發讀取器可能會失敗,更糟糕的是,當真空
刪除尚未提交的文件。您必須選擇一個比最長運行的並發事務和任何流滯後於表的最新更新的最長時間都要長的時間間隔。
三角洲湖有安全檢查,防止你跑危險的地方真空
命令。如果您確定在此表上執行的操作所花費的時間沒有超過您計劃指定的保留間隔,則可以通過設置Spark配置屬性關閉此安全檢查spark.databricks.delta.retentionDurationCheck.enabled
來假
.
檢索Delta表曆史記錄
方法可以檢索關於每次寫入Delta表的操作、用戶、時間戳等的信息曆史
命令。操作按時間順序返回。默認情況下,表曆史記錄將保留30天。
描述曆史' /數據/事件/ '——獲取該表的全部曆史描述曆史δ.' /數據/事件/ '描述曆史' /數據/事件/ '限製1——隻獲取最後一個操作描述曆史eventsTable
有關Spark SQL語法的詳細信息,請參見
數據庫運行時7。X及以上:描述曆史(Delta Lake on Databricks)
Databricks運行時5.5 LTS和6.x:描述曆史(Delta Lake on Databricks)
請注意
Python API在Databricks Runtime 6.1及以上版本中可用。
從delta.tables進口*deltaTable=DeltaTable.forPath(火花,pathToTable)fullHistoryDF=deltaTable.曆史()#獲取表的全部曆史lastOperationDF=deltaTable.曆史(1)#獲取最後一個操作
請注意
Scala API在Databricks Runtime 6.0及以上版本中可用。
進口io.δ.表._瓦爾deltaTable=DeltaTable.forPath(火花,pathToTable)瓦爾fullHistoryDF=deltaTable.曆史()//獲取表的全部曆史瓦爾lastOperationDF=deltaTable.曆史(1)//獲取最後一個操作
請注意
Java API在Databricks Runtime 6.0及以上版本中可用。
進口io.delta.tables。*;DeltaTabledeltaTable=DeltaTable.forPath(火花,pathToTable);DataFramefullHistoryDF=deltaTable.曆史();//獲取表的全部曆史DataFramelastOperationDF=deltaTable.曆史(1);//獲取DeltaTable上的最後一個操作
看到三角洲湖api查看Scala/Java/Python語法細節。
曆史模式
的輸出曆史
操作有以下列。
列 |
類型 |
描述 |
---|---|---|
版本 |
長 |
操作生成的表版本。 |
時間戳 |
時間戳 |
提交此版本時。 |
用戶標識 |
字符串 |
執行操作的用戶ID。 |
用戶名 |
字符串 |
執行操作的用戶名。 |
操作 |
字符串 |
操作名稱。 |
operationParameters |
地圖 |
操作的參數(例如謂詞)。 |
工作 |
結構體 |
運行操作的作業的詳細信息。 |
筆記本 |
結構體 |
運行操作的筆記本的詳細信息。 |
clusterId |
字符串 |
執行操作的集群ID。 |
readVersion |
長 |
為執行寫操作而讀取的表的版本。 |
isolationLevel |
字符串 |
用於此操作的隔離級別。 |
isBlindAppend |
布爾 |
該操作是否追加數據。 |
operationMetrics |
地圖 |
操作的度量(例如,修改的行數和文件數)。 |
userMetadata |
字符串 |
如果指定了用戶定義提交元數據 |
+-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+ | 版| |時間戳userId |操作用戶名| | operationParameters | |工作筆記本| clusterId | readVersion | isolationLevel | isBlindAppend | operationMetrics | +-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+ | 5 | 2019-07-2914:07:47| ###| ###| DELETE|[predicate ->["(…|零|###| ###| 4|WriteSerializable| false|[numTotalRows -> ...| | 4|2019-07-29 14:07:41| ###| ###| UPDATE|[predicate -> (id...|null| ###| ###| 3|WriteSerializable| false|[numTotalRows -> ...| | 3|2019-07-29 14:07:29| ###| ###| DELETE|[predicate -> ["(...|null| ###| ###| 2|WriteSerializable| false|[numTotalRows -> ...| | 2|2019-07-29 14:06:56| ###| ###| UPDATE|[predicate -> (id...|null| ###| ###| 1|WriteSerializable| false|[numTotalRows -> ...| | 1|2019-07-29 14:04:31| ###| ###| DELETE|[predicate -> ["(...|null| ###| ###| 0|WriteSerializable| false|[numTotalRows -> ...| | 0|2019-07-29 14:01:40| ###| ###| WRITE|[mode -> ErrorIfE...|null| ###| ###| null|WriteSerializable| true|[numFiles -> 2, n...| +-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+
請注意
隻有使用history命令時,才能查看到操作指標而且曆史記錄中的操作是使用Databricks Runtime 6.5或以上版本運行的。
如果使用以下方法寫入Delta表,則其他一些列不可用:
將來添加的列將始終添加在最後一列之後。
運營指標關鍵
的曆史
控件中的操作指標的集合operationMetrics
列映射。
下表按操作列出了映射鍵的定義。
操作 |
指標名稱 |
描述 |
---|---|---|
寫入,創建表作為選擇,替換表作為選擇,複製到 |
||
numFiles |
寫入的文件數。 |
|
numOutputBytes |
寫入內容的字節大小。 |
|
numOutputRows |
寫入的行數。 |
|
流媒體更新 |
||
numAddedFiles |
添加的文件數量。 |
|
numRemovedFiles |
刪除的文件數量。 |
|
numOutputRows |
寫入的行數。 |
|
numOutputBytes |
以字節為單位的寫入大小。 |
|
刪除 |
||
numAddedFiles |
添加的文件數量。刪除表的分區時不提供。 |
|
numRemovedFiles |
刪除的文件數量。 |
|
numDeletedRows |
刪除的行數。刪除表的分區時不提供。 |
|
numCopiedRows |
刪除文件過程中複製的行數。 |
|
executionTimeMs |
執行整個操作所花費的時間。 |
|
scanTimeMs |
掃描文件以查找匹配的時間。 |
|
rewriteTimeMs |
重寫匹配文件所花費的時間。 |
|
截斷 |
||
numRemovedFiles |
刪除的文件數量。 |
|
executionTimeMs |
執行整個操作所花費的時間。 |
|
合並 |
||
numSourceRows |
源數據幀中的行數。 |
|
numTargetRowsInserted |
插入到目標表中的行數。 |
|
numTargetRowsUpdated |
目標表中更新的行數。 |
|
numTargetRowsDeleted |
在目標表中刪除的行數。 |
|
numTargetRowsCopied |
複製的目標行數。 |
|
numOutputRows |
寫入的總行數。 |
|
numTargetFilesAdded |
添加到接收器(目標)的文件數。 |
|
numTargetFilesRemoved |
從接收器(目標)中刪除的文件數。 |
|
executionTimeMs |
執行整個操作所花費的時間。 |
|
scanTimeMs |
掃描文件以查找匹配的時間。 |
|
rewriteTimeMs |
重寫匹配文件所花費的時間。 |
|
更新 |
||
numAddedFiles |
添加的文件數量。 |
|
numRemovedFiles |
刪除的文件數量。 |
|
numUpdatedRows |
更新的行數。 |
|
numCopiedRows |
在更新文件的過程中剛剛複製的行數。 |
|
executionTimeMs |
執行整個操作所花費的時間。 |
|
scanTimeMs |
掃描文件以查找匹配的時間。 |
|
rewriteTimeMs |
重寫匹配文件所花費的時間。 |
|
FSCK |
numRemovedFiles |
刪除的文件數量。 |
轉換 |
numConvertedFiles |
已轉換的Parquet文件數。 |
優化 |
||
numAddedFiles |
添加的文件數量。 |
|
numRemovedFiles |
優化的文件數量。 |
|
numAddedBytes |
優化表後添加的字節數。 |
|
numRemovedBytes |
刪除的字節數。 |
|
minFileSize |
優化表後最小文件的大小。 |
|
p25FileSize |
表優化後的第25百分位文件的大小。 |
|
p50FileSize |
表優化後的中位數文件大小。 |
|
p75FileSize |
表優化後的第75百分位文件的大小。 |
|
maxFileSize |
優化表後最大文件的大小。 |
操作 |
指標名稱 |
描述 |
---|---|---|
克隆(1) |
||
sourceTableSize |
克隆版本的源表的大小(以字節為單位)。 |
|
sourceNumOfFiles |
克隆版本的源表中的文件數。 |
|
numRemovedFiles |
如果替換了以前的Delta表,則從目標表中刪除的文件數。 |
|
removedFilesSize |
如果替換了以前的Delta表,則從目標表中刪除的文件的總大小(以字節為單位)。 |
|
numCopiedFiles |
複製到新位置的文件數。0表示淺克隆。 |
|
copiedFilesSize |
複製到新位置的文件的總大小(以字節為單位)。0表示淺克隆。 |
|
恢複(2) |
||
tableSizeAfterRestore |
恢複後的表大小(以字節為單位)。 |
|
numOfFilesAfterRestore |
恢複後表中的文件數。 |
|
numRemovedFiles |
恢複操作刪除的文件數量。 |
|
numRestoredFiles |
由於恢複而添加的文件數。 |
|
removedFilesSize |
大小(以字節為單位),恢複刪除的文件。 |
|
restoredFilesSize |
由恢複添加的文件的大小(以字節為單位)。 |
|
真空(3) |
||
numDeletedFiles |
刪除的文件數。 |
|
numVacuumedDirectories |
真空目錄個數。 |
|
numFilesToDelete |
要刪除的文件數量。 |
(1)要求Databricks Runtime 7.3 LTS或以上版本。
(2)要求Databricks Runtime 7.4或以上版本。
(3)要求Databricks Runtime 8.2或以上版本。
檢索Delta表詳細信息
您可以檢索關於Delta表的詳細信息(例如,文件數量、數據大小)描述細節
.
描述細節' /數據/事件/ '描述細節eventsTable
有關Spark SQL語法的詳細信息,請參見
數據庫運行時7。X及以上:描述的細節
Databricks運行時5.5 LTS和6.x:詳細描述(Databricks上的Delta Lake)
詳細模式
此操作的輸出隻有一行具有以下模式。
列 |
類型 |
描述 |
---|---|---|
格式 |
字符串 |
表的格式,即 |
id |
字符串 |
表的唯一ID。 |
的名字 |
字符串 |
在轉移瘤中定義的表名。 |
描述 |
字符串 |
該表的描述信息。 |
位置 |
字符串 |
表的位置。 |
createdAt |
時間戳 |
當創建表時。 |
lastModified |
時間戳 |
該表最後一次修改的時間。 |
partitionColumns |
字符串數組 |
如果表已分區,則為分區列的名稱。 |
numFiles |
長 |
表的最新版本中的文件數。 |
sizeInBytes |
int |
表的最新快照大小(以字節為單位)。 |
屬性 |
string-string地圖 |
為該表設置的所有屬性。 |
minReaderVersion |
int |
能夠讀取表的最小讀取器版本(根據日誌協議)。 |
minWriterVersion |
int |
可以寫入表的最小寫程序版本(根據日誌協議)。 |
+------+--------------------+------------------+-----------+--------------------+--------------------+-------------------+----------------+--------+-----------+----------+----------------+----------------+ | 格式| | id名稱| |描述位置| createdAt | lastModified | partitionColumns | numFiles | sizeInBytes | |屬性minReaderVersion | minWriterVersion |+------+--------------------+------------------+-----------+--------------------+--------------------+-------------------+----------------+--------+-----------+----------+----------------+----------------+ | 三角洲| d31f82d2-a69f-42e…| default.deltatable零| |文件:/用戶/圖奧/…| 2020-06-05 12:20:…|2020-06-05 12:20:20| []| 10| 12345| []| 1| 2| +------+--------------------+------------------+-----------+--------------------+--------------------+-------------------+----------------+--------+-----------+----------+----------------+----------------+
生成清單文件
您可以為Delta表生成清單文件,其他處理引擎(即Apache Spark以外的引擎)可以使用該清單文件讀取Delta表。例如,要生成一個可以被Presto和Athena用來讀取Delta表的清單文件,您可以運行以下命令:
生成symlink_format_manifest為表格δ.' /tmp/事件`生成symlink_format_manifest為表格eventsTable
請注意
Python API在Databricks Runtime 6.3及以上版本中可用。
deltaTable=DeltaTable.forPath(<路徑-來-δ-表格>)deltaTable.生成(“symlink_format_manifest”)
請注意
Scala API在Databricks Runtime 6.3及以上版本中可用。
瓦爾deltaTable=DeltaTable.forPath(<路徑-來-δ-表格>)deltaTable.生成(“symlink_format_manifest”)
請注意
Java API在Databricks Runtime 6.3及以上版本中可用。
DeltaTabledeltaTable=DeltaTable.forPath(<路徑-來-δ-表格>);deltaTable.生成(“symlink_format_manifest”);
把拚花桌改成三角桌
把拚花桌改成三角桌。該命令列出目錄中的所有文件,創建跟蹤這些文件的Delta Lake事務日誌,並通過讀取所有Parquet文件的頁腳自動推斷數據模式。如果數據是分區的,則必須將分區列的模式指定為ddl格式的字符串(即,< column-name1 >< >類型,< column-name2 >< >類型,...
)。
請注意
如果使用結構化流創建Parquet表,則可以使用_spark_metadata
子目錄作為設置SQL配置的表中包含的文件的真偽源spark.databricks.delta.convert.useMetadataLog
來真正的
.
——在路徑<路徑到表>的位置轉換未分區的拚花表轉換來δ拚花.' <路徑-來-表格>”轉換分區的Parquet表在路徑'<路徑到表>'和分區的整數列命名為'part'和'part2'轉換來δ拚花.' <路徑-來-表格>”分區通過(部分int,第二部分int)
有關語法的詳細信息,請參見
數據庫運行時7。X及以上:轉換為
Databricks運行時5.5 LTS和6.x:轉換到Delta (Databricks上的Delta Lake)
請注意
Python API在Databricks Runtime 6.1及以上版本中可用。
從delta.tables進口*#在路徑“<路徑到表>”處轉換未分區的拚花表deltaTable=DeltaTable.convertToDelta(火花,“parquet. < path-to-table >”)#轉換路徑<路徑到表>的分區拚花表,並按整數列命名為“part”進行分區partitionedDeltaTable=DeltaTable.convertToDelta(火花,“parquet. < path-to-table >”,“int一部分”)
請注意
Scala API在Databricks Runtime 6.0及以上版本中可用。
進口io.δ.表._//轉換未分區的Parquet表在路徑'<路徑到表>'瓦爾deltaTable=DeltaTable.convertToDelta(火花,“parquet. < path-to-table >”)//轉換路徑'<路徑到表>'的分區拚花表,並由命名為'part'和'part2'的整數列分區瓦爾partitionedDeltaTable=DeltaTable.convertToDelta(火花,“parquet. < path-to-table >”,"part int, part2 int")
請注意
Scala API在Databricks Runtime 6.0及以上版本中可用。
進口io.delta.tables。*;//轉換未分區的Parquet表在路徑'<路徑到表>'DeltaTabledeltaTable=DeltaTable.convertToDelta(火花,“parquet. < path-to-table >”);//轉換路徑'<路徑到表>'的分區拚花表,並由命名為'part'和'part2'的整數列分區DeltaTabledeltaTable=DeltaTable.convertToDelta(火花,“parquet. < path-to-table >”,"part int, part2 int");
請注意
任何沒有被Delta Lake跟蹤的文件都是不可見的,可以在運行時刪除真空
.您應該避免在轉換過程中更新或追加數據文件。轉換表之後,確保所有寫操作都經過Delta Lake。
將冰山表轉換為Delta表
如果冰山表的底層文件格式為Parquet,則可以將冰山表轉換為Delta表。下麵的命令基於Iceberg表的本機文件清單、模式和分區信息創建Delta Lake事務日誌。轉換器還在轉換期間收集列統計信息,除非沒有統計數據
都是確定的。
——轉換路徑中的冰山表。 轉換來δ冰山.' <路徑-來-表格>”——轉換路徑的冰山表,不收集統計信息。 轉換來δ冰山.' <路徑-來-表格>”沒有統計數據
請注意
不支持轉換Iceberg亞metastore表。
把一張三角桌改成拚花桌
您可以使用以下步驟輕鬆地將Delta表轉換回拚花表:
如果您執行了Delta Lake操作,可以更改數據文件(例如,
刪除
或合並
),運行真空保留時間為0小時,用於刪除不屬於該表最新版本的所有數據文件。刪除
_delta_log
目錄中的表目錄。
將Delta表恢複到較早的狀態
請注意
在Databricks Runtime 7.4及以上版本中可用。
方法可以將Delta表恢複到其早期狀態恢複
命令。Delta表在內部維護表的曆史版本,使其能夠恢複到較早的狀態。控件支持與早期狀態對應的版本或創建早期狀態的時間戳作為選項恢複
命令。
重要的
可以恢複已經恢複的表。
您可以恢複克隆表格
將表恢複到手動或通過。刪除數據文件的舊版本
真空
將會失敗。部分恢複到這個版本仍然是可能的,如果spark.sql.files.ignoreMissingFiles
設置為真正的
.恢複到較早狀態的時間戳格式為
yyyy-MM-ddHH: mm: ss
.隻提供日期(yyyy-MM-dd
)字符串也支持。
恢複表格db.target_table來版本作為的<版本>恢複表格δ.' /數據/目標/ '來時間戳作為的<時間戳>
從delta.tables進口*deltaTable=DeltaTable.forPath(火花,<路徑-來-表格>)#基於路徑的表,或者deltaTable=DeltaTable.forName(火花,<表格-的名字>)# Hive基於metastore的表deltaTable.restoreToVersion(0)#恢複表到最老版本deltaTable.restoreToTimestamp(“2019-02-14”)#恢複到特定的時間戳
進口io.δ.表._瓦爾deltaTable=DeltaTable.forPath(火花,<路徑-來-表格>)瓦爾deltaTable=DeltaTable.forName(火花,<表格-的名字>)deltaTable.restoreToVersion(0)//恢複表到最老版本deltaTable.restoreToTimestamp(“2019-02-14”)//恢複到特定的時間戳
進口io.delta.tables。*;DeltaTabledeltaTable=DeltaTable.forPath(火花,<路徑-來-表格>);DeltaTabledeltaTable=DeltaTable.forName(火花,<表格-的名字>);deltaTable.restoreToVersion(0)//恢複表到最老版本deltaTable.restoreToTimestamp(“2019-02-14”)//恢複到特定的時間戳
有關語法的詳細信息,請參見還原(Delta Lake on Databricks).
重要的
恢複被認為是一個數據更改操作。三角洲湖日誌條目添加恢複
命令包含dataChange設置為true。如果存在下遊應用,例如結構化流作業處理Delta Lake表的更新時,恢複操作添加的數據更改日誌項被視為新的數據更新,處理它們可能會導致數據重複。
例如:
表版本 |
操作 |
Delta日誌更新 |
在數據變更日誌中記錄更新 |
---|---|---|---|
0 |
插入 |
AddFile(/path/to/file-1, dataChange = true) |
(名字=維克多,年齡= 29,(名字=喬治,年齡= 55) |
1 |
插入 |
AddFile(/path/to/file-2, dataChange = true) |
(名字= George,年齡= 39) |
2 |
優化 |
AddFile(/path/to/file-3, dataChange = false), RemoveFile(/path/to/file-1), RemoveFile(/path/to/file-2) |
(沒有記錄,因為優化壓縮不會改變表中的數據) |
3. |
恢複(version = 1) |
RemoveFile(/path/to/file-3), AddFile(/path/to/file-1, dataChange = true), AddFile(/path/to/file-2, dataChange = true) |
(名字=維克多,年齡= 29),(名字=喬治,年齡= 55),(名字=喬治,年齡= 39) |
在上麵的例子中,恢複
命令會導致在讀取Delta表版本0和1時已經看到的更新。如果一個流查詢正在讀取這個表,那麼這些文件將被視為新添加的數據,並將再次處理。
克隆一個Delta表
請注意
在Databricks Runtime 7.2及以上版本中可用。
方法可以在特定版本中創建現有Delta表的副本克隆
命令。克隆可以是深的,也可以是淺的。
克隆類型
一個深克隆是一個克隆,它除了將現有表的元數據複製外,還將源表數據複製到克隆目標。此外,還會克隆流元數據,這樣寫入Delta表的流可以在源表上停止,並從它停止的地方在克隆的目標上繼續。
一個淺克隆不將數據文件複製到克隆目標的克隆。表元數據等價於源。這些複製品的製作成本更低。
對深度克隆或淺克隆所做的任何更改隻影響克隆本身,而不影響源表。
克隆的元數據包括:模式、分區信息、不變量、可空性。僅對於深度克隆,流和複製到元數據也會被克隆。未克隆的元數據是表描述和用戶定義提交元數據.
重要的
淺克隆引用源目錄中的數據文件。如果你跑
真空
在源表上,客戶端將不再能夠讀取引用的數據文件和FileNotFoundException
會被拋出。在這種情況下,在淺克隆上運行clone with replace將修複克隆。如果這種情況經常發生,請考慮使用不依賴源表的深度克隆。深度克隆不依賴於它們被克隆的源,但是創建它們的成本很高,因為深度克隆會複製數據和元數據。
克隆與
取代
如果在該路徑上沒有表,則創建一個Delta日誌。運行命令可以清除任何現有數據真空
.如果現有的Delta表存在,則創建一個新的提交,其中包含來自源表的新元數據和新數據。這個新的提交是增量的,這意味著自上次克隆以來隻有新的更改被提交到表中。
克隆一個表是不同的
創建表格作為選擇
或商品交易顧問基金
.克隆除了複製數據之外,還複製源表的元數據。克隆還具有更簡單的語法:您不需要指定分區、格式、不變量、可空性等,因為它們是從源表中獲取的。克隆表具有獨立於源表的曆史。克隆表上的時間旅行查詢將不能使用與其源表上相同的輸入。
創建表格δ.' /數據/目標/ '克隆δ.' /數據/源/ '—在/data/target處創建/data/source的深度克隆創建或取代表格db.target_table克隆db.source_table——替換目標創建表格如果不存在δ.' /數據/目標/ '克隆db.source_table——如果目標表存在,則不執行操作創建表格db.target_table淺克隆δ.' /數據/源`創建表格db.target_table淺克隆δ.' /數據/源`版本作為的版本創建表格db.target_table淺克隆δ.' /數據/源`時間戳作為的timestamp_expression——timestamp可以是像" 2019-01-01 "或者像date_sub(current_date(), 1)
從delta.tables進口*deltaTable=DeltaTable.forPath(火花,pathToTable)#基於路徑的表,或者deltaTable=DeltaTable.forName(火花,的表)# Hive基於metastore的表deltaTable.克隆(目標,isShallow,取代)#克隆源代碼的最新版本deltaTable.cloneAtVersion(版本,目標,isShallow,取代)#克隆特定版本的源代碼#在特定的時間戳上克隆源代碼,如timestamp= " 2019-01-01 "deltaTable.cloneAtTimestamp(時間戳,目標,isShallow,取代)
進口io.δ.表._瓦爾deltaTable=DeltaTable.forPath(火花,pathToTable)瓦爾deltaTable=DeltaTable.forName(火花,的表)deltaTable.克隆(目標,isShallow,取代)//克隆源到最新版本deltaTable.cloneAtVersion(版本,目標,isShallow,取代)//克隆源到特定版本deltaTable.cloneAtTimestamp(時間戳,目標,isShallow,取代)//在特定時間戳克隆源代碼
進口io.delta.tables。*;DeltaTabledeltaTable=DeltaTable.forPath(火花,pathToTable);DeltaTabledeltaTable=DeltaTable.forName(火花,的表);deltaTable.克隆(目標,isShallow,取代)//克隆源到最新版本deltaTable.cloneAtVersion(版本,目標,isShallow,取代)//克隆源到特定版本deltaTable.cloneAtTimestamp(時間戳,目標,isShallow,取代)//在特定時間戳克隆源代碼
有關語法的詳細信息,請參見創建表克隆.
克隆指標
請注意
在Databricks Runtime 8.2及以上版本中可用。
克隆
一旦操作完成,報告以下指標作為單行數據幀:
source_table_size
:正在克隆的源表的大小(以字節為單位)。source_num_of_files
:源表中的文件數。num_removed_files
:如果表正在被替換,則表示從當前表中刪除的文件數量。num_copied_files
:從源複製的文件數量(淺克隆為0)。removed_files_size
:從當前表中刪除的文件的字節大小。copied_files_size
:複製到表中的文件的字節大小。
權限
必須為Databricks表訪問控製和雲提供程序配置權限。
克隆用例
在本節中:
數據歸檔
數據可能需要保存的時間比時間旅行或災難恢複所允許的時間長。在這些情況下,可以創建深度克隆來保存表在某個時間點的狀態以便存檔。增量歸檔還可以保持源表的持續更新狀態,以進行災難恢複。
——每月運行一次創建或取代表格δ.' /一些/存檔/路徑`克隆my_prod_table
機器學習流程再現
在進行機器學習時,您可能想要對訓練ML模型的表的某個版本進行歸檔。未來的模型可以使用這個存檔數據集進行測試。
——在Delta表15版本上訓練模型創建表格δ.' /模型/數據集`克隆entire_dataset版本作為的15
在生產台上進行短期實驗
要在不損壞表的情況下在生產表上測試工作流,您可以輕鬆地創建一個淺克隆。這允許您在包含所有生產數據但不影響任何生產工作負載的克隆表上運行任意工作流。
—執行淺克隆創建或取代表格my_test淺克隆my_prod_table;更新my_test在哪裏user_id是零集無效的=真正的;運行一係列驗證。曾經快樂的:—這應該利用克隆中的更新信息來修剪為僅——如果可能,修改克隆中的文件合並成my_prod_table使用my_test在my_test.user_id< = >my_prod_table.user_id當匹配和my_test.user_id是零然後更新*;下降表格my_test;
數據共享
單個組織中的其他業務單位可能希望訪問相同的數據,但可能不需要最新的更新。您可以為不同的業務單元提供具有不同權限的克隆,而不是直接提供對源表的訪問。克隆的性能可以超過簡單視圖的性能。
—執行深度克隆創建或取代表格shared_table克隆my_prod_table;——授權其他用戶訪問共享表格蘭特選擇在shared_table來' <用戶-的名字> @ <用戶-域>.com`;
表屬性覆蓋
請注意
在Databricks Runtime 7.5及以上版本中可用。
表屬性覆蓋在以下情況下特別有用:
在與不同業務單元共享數據時,使用所有者或用戶信息注釋表。
需要歸檔Delta表和時間旅行。可以為歸檔表單獨指定日誌保留周期。例如:
創建或取代表格存檔.my_table克隆刺激.my_tableTBLPROPERTIES(δ.logRetentionDuration=“3650天”,δ.deletedFileRetentionDuration=“3650天”)位置“xx: / /歸檔/ my_table”
dt=DeltaTable.forName(火花,“prod.my_table”)tblProps={“delta.logRetentionDuration”:“3650天”,“delta.deletedFileRetentionDuration”:“3650天”}dt.克隆(“xx: / /歸檔/ my_table”,isShallow=假,取代=真正的,tblProps)
瓦爾dt=DeltaTable.forName(火花,“prod.my_table”)瓦爾tblProps=地圖(“delta.logRetentionDuration”->“3650天”,“delta.deletedFileRetentionDuration”->“3650天”)dt.克隆(“xx: / /歸檔/ my_table”,isShallow=假,取代=真正的,屬性=tblProps)
在Spark會話中查找上一次提交的版本
請注意
在Databricks Runtime 7.1及以上版本中可用。
對象寫入的最後一次提交的版本號SparkSession
跨所有線程和所有表,查詢SQL配置spark.databricks.delta.lastCommitVersionInSession
.
集火花.磚.δ.lastCommitVersionInSession
火花.相依.得到(“spark.databricks.delta.lastCommitVersionInSession”)
火花.相依.得到(“spark.databricks.delta.lastCommitVersionInSession”)
對象沒有提交SparkSession
,查詢該鍵將返回空值。
請注意
如果你擁有同樣的SparkSession
跨多線程,它類似於跨多線程共享一個變量;當配置值同時更新時,您可能會遇到競態條件。