有選擇地與三角洲湖覆蓋數據
磚利用三角洲湖功能為選擇性覆蓋支持兩個不同的選項:
的
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”,假)
集火花。磚。δ。replaceWhere。constraintCheck。啟用=假
在磚運行時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
作為真正的
當使用動態分區覆蓋。