有選擇地用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”
火花δreplaceWhereconstraintCheck啟用

在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指定要覆蓋哪些數據。

如果一個分區被意外覆蓋,您可以使用恢複要撤消更改。