有選擇地用Delta Lake覆蓋數據
Databricks利用Delta Lake功能支持兩種不同的選擇性覆蓋選項:
的
replaceWhere
選項自動替換與給定謂詞匹配的所有記錄。可以使用動態分區覆蓋根據表的分區方式替換數據目錄。
任意選擇覆蓋replaceWhere
您可以選擇性地隻覆蓋與任意表達式匹配的數據。該特性在DataFrames中可用Databricks Runtime 9.1 LTS及以上,並在SQL中支持Databricks Runtime 12.0及以上。
下麵的命令原子地替換目標表中一月份的事件,該目標表由start_date
,數據在replace_data
:
(replace_data.寫.模式(“覆蓋”).選項(“replaceWhere”,"start_date >= '2017-01-01' AND end_date <= '2017-01-31'").保存(“/ tmp /δ/事件”))
replace_data.寫.模式(“覆蓋”).選項(“replaceWhere”,"start_date >= '2017-01-01' AND end_date <= '2017-01-31'").保存(“/ tmp /δ/事件”)
插入成表格事件取代在哪裏start_data> =“2017-01-01”和end_date< =“2017-01-31”選擇*從replace_data
這個示例代碼將數據寫入replace_data
,驗證它是否完全匹配謂詞,並執行原子替換。如果希望寫出與謂詞不完全匹配的數據,以替換目標表中的匹配行,可以通過設置禁用約束檢查spark.databricks.delta.replaceWhere.constraintCheck.enabled
假:
火花.相依.集(“spark.databricks.delta.replaceWhere.constraintCheck.enabled”,假)
火花.相依.集(“spark.databricks.delta.replaceWhere.constraintCheck.enabled”,假)
集火花.磚.δ.replaceWhere.constraintCheck.啟用=假
在Databricks Runtime 9.0及以下版本中,replaceWhere
僅覆蓋分區列上匹配謂詞的數據。下麵的命令原子地替換目標表中的一月,該目標表是按日期
,數據在df
:
(df.寫.模式(“覆蓋”).選項(“replaceWhere”,"birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'").保存(“/ tmp /δ/ people10m”))
df.寫.模式(“覆蓋”).選項(“replaceWhere”,"birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'").保存(“/ tmp /δ/ people10m”)
在Databricks運行時9.1及以上版本中,如果您想回落到舊的行為,可以禁用spark.databricks.delta.replaceWhere.dataColumns.enabled
國旗:
火花.相依.集(“spark.databricks.delta.replaceWhere.dataColumns.enabled”,假)
火花.相依.集(“spark.databricks.delta.replaceWhere.dataColumns.enabled”,假)
集火花.磚.δ.replaceWhere.上.啟用=假
動態分區覆蓋
預覽
此功能已在公共預覽.
支持Databricks運行時11.1及以上版本動態分區表的分區覆蓋模式。對於有多個分區的表,Databricks Runtime 12.0及以下版本僅在所有分區列具有相同數據類型時支持動態分區覆蓋。
在動態分區覆蓋模式下,我們將覆蓋每個邏輯分區中的所有現有數據,寫入將為其提交新數據。寫操作不包含數據的任何現有邏輯分區將保持不變。該模式僅適用於數據寫入為覆蓋模式時插入覆蓋
在SQL中,或者DataFrame寫入df.write.mode(“覆蓋”)
.
通過設置Spark會話配置,配置動態分區覆蓋模式spark.sql.sources.partitionOverwriteMode
來動態
.屬性也可以啟用此功能DataFrameWriter
選項partitionOverwriteMode
來動態
.如果存在,特定於查詢的選項將覆蓋會話配置中定義的模式。默認的partitionOverwriteMode
是靜態
.
集火花.sql.來源.partitionOverwriteMode=動態;插入覆蓋表格默認的.people10m選擇*從更多人;
(df.寫.模式(“覆蓋”).選項(“partitionOverwriteMode”,“動態”).saveAsTable(“default.people10m”))
df.寫.模式(“覆蓋”).選項(“partitionOverwriteMode”,“動態”).saveAsTable(“default.people10m”)
請注意
動態分區覆蓋與該選項衝突replaceWhere
對於分區表。
如果Spark會話配置中啟用了動態分區覆蓋
replaceWhere
提供為DataFrameWriter
選項,則Delta Lake將根據replaceWhere
表達式(特定於查詢的選項會覆蓋會話配置)。方法將收到一個錯誤
DataFrameWriter
選項包括動態分區覆蓋和replaceWhere
啟用。
重要的
驗證使用動態分區覆蓋寫入的數據隻涉及預期的分區。錯誤分區中的單個行可能會導致無意中覆蓋整個分區。我們建議使用replaceWhere
指定要覆蓋哪些數據。
如果一個分區被意外覆蓋,您可以使用恢複要撤消更改。