在Databricks上克隆一個表
屬性可以在Databricks上創建特定版本的現有Delta Lake表的副本克隆
命令。克隆體可以是深的,也可以是淺的。
克隆是Databricks運行時默認啟用的Databricks獨有特性。
Databricks還支持克隆Parquet和Iceberg表。看到增量克隆拚花和冰山表三角洲湖.
克隆類型
一個深克隆是一個克隆,它將源表數據除現有表的元數據外複製到克隆目標。此外,流元數據也被克隆,這樣寫入Delta表的流可以在源表上停止,並在克隆的目標表上從它停止的地方繼續。
一個淺克隆不將數據文件複製到克隆目標的克隆。表元數據等同於源數據。這些克隆的成本更低。
對深克隆或淺克隆所做的任何更改隻影響克隆本身,而不影響源表。
克隆的元數據包括:模式、分區信息、不變量、可空性。僅對於深度克隆,流和複製到元數據也被克隆。未克隆的元數據是表描述和用戶定義提交元數據.
重要的
淺克隆引用源目錄中的數據文件。如果你跑了
真空
在源表上,客戶端將不再能夠讀取引用的數據文件和FileNotFoundException
會被扔。在這種情況下,在淺克隆上運行clone和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——時間戳可以是" 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
:複製到表中的文件的字節大小。
使用克隆進行數據歸檔
數據可能需要保存的時間超過時間旅行或災難恢複的可行時間。在這些情況下,您可以創建一個深度克隆來保存表在某個時間點的狀態,以便存檔。增量歸檔還可以保持源表的持續更新狀態,以便進行災難恢複。
——每月跑步創建或取代表格δ.' /一些/存檔/路徑`克隆my_prod_table
使用克隆的ML模型複製
在進行機器學習時,您可能希望對訓練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`;
使用clone重寫表屬性
請注意
在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)