有選擇地與三角洲湖覆蓋數據

磚利用三角洲湖功能為選擇性覆蓋支持兩個不同的選項:

  • replaceWhere選擇自動替換匹配給定謂詞的所有記錄。

  • 可以替換目錄的數據基於表分區使用動態分區覆蓋。

對於大多數操作,磚推薦使用replaceWhere指定的數據覆蓋。

重要的

如果數據被意外地覆蓋,可以使用恢複撤消更改。

任意選擇覆蓋與replaceWhere

你可以選擇性地覆蓋隻匹配一個任意的數據表達。這個特性與DataFrames可用磚運行時9.1 LTS及以上和支持SQL磚12.0運行時及以上。

下麵的命令自動替換事件1月目標表,分區的start_date中的數據replace_data:

(replace_data模式(“覆蓋”)選項(“replaceWhere”,“start_date > = ' 2017-01-01 '和end_date < = 2017-01-31”)保存(“/ tmp /δ/事件”))
replace_data模式(“覆蓋”)選項(“replaceWhere”,“start_date > = ' 2017-01-01 '和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啟用=

在磚運行時9.0及以下,replaceWhere覆蓋數據匹配謂詞在分區列。下麵的命令自動替換1月目標表,分區的日期中的數據df:

(df模式(“覆蓋”)選項(“replaceWhere”,“生日> = ' 2017-01-01 '和生日< = 2017-01-31”)保存(“/ tmp /δ/ people10m”))
df模式(“覆蓋”)選項(“replaceWhere”,“生日> = ' 2017-01-01 '和生日< = 2017-01-31”)保存(“/ tmp /δ/ people10m”)

在磚運行時9.1及以上的,如果你想回到舊的行為,您可以禁用spark.databricks.delta.replaceWhere.dataColumns.enabled國旗:

火花相依(“spark.databricks.delta.replaceWhere.dataColumns.enabled”,)
火花相依(“spark.databricks.delta.replaceWhere.dataColumns.enabled”,)
火花δreplaceWhere啟用=

動態分區覆蓋

預覽

這個特性是在公共預覽

磚運行時11.1及以上支持動態為分區表分區覆蓋模式。對於多個分區的表,磚12.0運行時,下麵隻支持動態分區覆蓋如果所有分區列是相同的數據類型。

在動態分區覆蓋模式下,業務覆蓋所有現有數據在每一個邏輯分區的寫提交新的數據。任何現有的邏輯分區的寫不包含數據保持不變。這種模式隻適用於當數據被寫在覆蓋模式:插入覆蓋在SQL或DataFrame寫字df.write.mode(“覆蓋”)

配置動態分區覆蓋模式通過設置引發會話配置spark.sql.sources.partitionOverwriteMode動態。你也可以啟用這個通過設置DataFrameWriter選項partitionOverwriteMode動態。如果存在,query-specific選項覆蓋會話配置中定義的模式。的默認值partitionOverwriteMode靜態

重要的

驗證數據與動態分區覆蓋觸動隻有預期的分區。一行在錯誤的分區可以導致無意中覆蓋整個分區。

下麵的例子演示了使用動態分區覆蓋:

火花sql來源partitionOverwriteMode=動態;插入覆蓋默認的people10m選擇*更多人;
(df模式(“覆蓋”)選項(“partitionOverwriteMode”,“動態”)saveAsTable(“default.people10m”))
df模式(“覆蓋”)選項(“partitionOverwriteMode”,“動態”)saveAsTable(“default.people10m”)

請注意

  • 動態分區覆蓋衝突與選擇replaceWhere分區表。

    • 如果啟用了動態分區覆蓋在火花會話配置中,和replaceWhere作為一個提供DataFrameWriter選項,然後根據三角洲湖覆蓋數據replaceWhere表達式(query-specific選項覆蓋會話配置)。

    • 如果你得到一個錯誤DataFrameWriter動態分區覆蓋和選項replaceWhere啟用。

  • 你不能指定overwriteSchema作為真正的當使用動態分區覆蓋。