在Databricks上克隆一個表

屬性可以在Databricks上創建特定版本的現有Delta Lake表的副本克隆命令。克隆體可以是深的,也可以是淺的。

克隆是Databricks運行時默認啟用的Databricks獨有特性。

Databricks還支持克隆Parquet和Iceberg表。看到增量克隆拚花和冰山表三角洲湖

克隆類型

  • 一個深克隆是一個克隆,它將源表數據除現有表的元數據外複製到克隆目標。此外,流元數據也被克隆,這樣寫入Delta表的流可以在源表上停止,並在克隆的目標表上從它停止的地方繼續。

  • 一個淺克隆不將數據文件複製到克隆目標的克隆。表元數據等同於源數據。這些克隆的成本更低。

對深克隆或淺克隆所做的任何更改隻影響克隆本身,而不影響源表。

克隆的元數據包括:模式、分區信息、不變量、可空性。僅對於深度克隆,流和複製到元數據也被克隆。未克隆的元數據是表描述和用戶定義提交元數據

重要的

  • 淺克隆引用源目錄中的數據文件。如果你跑了真空在源表上,客戶端將不再能夠讀取引用的數據文件和FileNotFoundException會被扔。在這種情況下,在淺克隆上運行clone和replace將修複克隆。如果經常發生這種情況,請考慮使用不依賴於源表的深度克隆。

  • 深度克隆不依賴於克隆它們的源,但創建成本很高,因為深度克隆複製數據和元數據。

  • 克隆與取代如果目標在該路徑上已經有表,則在該路徑上不存在表,則創建Delta日誌。您可以通過運行來清理任何現有數據真空

  • 如果存在一個現有的Delta表,則創建一個新的提交,其中包括來自源表的新元數據和新數據。這個新的提交是增量的,這意味著自上次克隆以來隻有新的更改被提交到表中。

  • 克隆表不同於創建表格作為選擇商品交易顧問基金。克隆除複製數據外,還複製源表的元數據。克隆還具有更簡單的語法:您不需要指定分區、格式、不變量、可空性等,因為它們是從源表中獲取的。

  • 克隆表具有獨立於源表的曆史記錄。克隆表上的時間旅行查詢與源表上的輸入不同。

創建表格δ' /數據/目標/ '克隆δ' /數據// '——在/data/target上創建/data/source的深度克隆創建取代表格dbtarget_table克隆dbsource_table——替換目標創建表格如果存在δ' /數據/目標/ '克隆dbsource_table——如果目標表存在,則無操作創建表格dbtarget_table克隆δ' /數據/創建表格dbtarget_table克隆δ' /數據/版本作為版本創建表格dbtarget_table克隆δ' /數據/時間戳作為timestamp_expression——時間戳可以是" 2019-01-01 "或者date_sub(current_date(), 1)
delta.tables進口*deltaTable=DeltaTableforPath火花pathToTable#基於路徑的表deltaTable=DeltaTableforName火花的表# Hive基於metastore的表deltaTable克隆目標isShallow取代#克隆最新版本的源代碼deltaTablecloneAtVersion版本目標isShallow取代#克隆特定版本的源代碼#在特定的時間戳克隆源代碼,例如timestamp= " 2019-01-01 "deltaTablecloneAtTimestamp時間戳目標isShallow取代
進口ioδ_瓦爾deltaTable=DeltaTableforPath火花pathToTable瓦爾deltaTable=DeltaTableforName火花的表deltaTable克隆目標isShallow取代//克隆最新版本的源代碼deltaTablecloneAtVersion版本目標isShallow取代//克隆一個特定版本的源代碼deltaTablecloneAtTimestamp時間戳目標isShallow取代//在特定時間戳克隆源代碼
進口io.delta.tables。*DeltaTabledeltaTable=DeltaTableforPath火花pathToTable);DeltaTabledeltaTable=DeltaTableforName火花的表);deltaTable克隆目標isShallow取代//克隆最新版本的源代碼deltaTablecloneAtVersion版本目標isShallow取代//克隆一個特定版本的源代碼deltaTablecloneAtTimestamp時間戳目標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模型複製

在進行機器學習時,您可能希望對訓練ML模型的表的某個版本進行歸檔。未來的模型可以使用這個存檔的數據集進行測試。

——在Delta表版本15上訓練模型創建表格δ' /模型/數據集克隆entire_dataset版本作為15

在生產台上使用克隆進行短期實驗

要在不破壞表的情況下在生產表上測試工作流,可以輕鬆地創建一個淺克隆。這允許您在包含所有生產數據但不影響任何生產工作負載的克隆表上運行任意工作流。

—執行淺克隆創建取代表格my_test克隆my_prod_table更新my_test在哪裏user_id無效的=真正的——進行一係列驗證。曾經快樂的:-這應該利用克隆中的更新信息來修剪——如果可能的話,修改克隆文件合並my_prod_table使用my_testmy_testuser_id< = >my_prod_tableuser_id匹配my_testuser_id然後更新*下降表格my_test

使用克隆方式共享數據

單個組織中的其他業務單元可能希望訪問相同的數據,但可能不需要最新的更新。您可以為不同的業務單元提供具有不同權限的克隆,而不是直接提供對源表的訪問。克隆的性能可以超過簡單視圖的性能。

—執行深度克隆創建取代表格shared_table克隆my_prod_table——授予其他用戶訪問共享表的權限格蘭特選擇shared_table' <用戶-名字> @ <用戶->com

使用clone重寫表屬性

請注意

在Databricks Runtime 7.5及以上版本中可用。

表屬性覆蓋特別有用:

  • 在與不同業務單元共享數據時,用所有者或用戶信息注釋表。

  • 需要存檔Delta表和時間旅行。您可以為存檔表單獨指定日誌保留期。例如:

創建取代表格存檔my_table克隆刺激my_tableTBLPROPERTIESδlogRetentionDuration=“3650天”δdeletedFileRetentionDuration=“3650天”位置“xx: / /歸檔/ my_table”
dt=DeltaTableforName火花“prod.my_table”tblProps=“delta.logRetentionDuration”“3650天”“delta.deletedFileRetentionDuration”“3650天”}dt克隆“xx: / /歸檔/ my_table”isShallow=取代=真正的tblProps
瓦爾dt=DeltaTableforName火花“prod.my_table”瓦爾tblProps=地圖“delta.logRetentionDuration”->“3650天”“delta.deletedFileRetentionDuration”->“3650天”dt克隆“xx: / /歸檔/ my_table”isShallow=取代=真正的屬性=tblProps