選擇性地使用 Delta Lake 覆寫數據
Azure Databricks 利用 Delta Lake 功能來支持兩個不同的選擇性覆寫選項:
- 選項會
replaceWhere
以不可部分完成的方式取代符合指定述詞的所有記錄。 - 您可以根據資料表使用動態分割覆寫的方式來取代資料目錄。
針對大部分的作業,Databricks 建議使用 replaceWhere
來指定要覆寫的數據。
重要
如果數據遭到意外覆寫,您可以使用 還原 來復原變更。
使用任意選擇性覆寫 replaceWhere
您可以選擇性地只覆寫符合任意表達式的數據。
注意
SQL 需要 Databricks Runtime 12.2 LTS 或更新版本。
下列命令會以 中的數據,在目標數據表中以 中的數據,以不可部分完成的方式取代目標數據表start_date
replace_data
中的事件:
Python
(replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.table("events")
)
Scala
replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.table("events")
SQL
INSERT INTO TABLE events REPLACE WHERE start_date >= '2017-01-01' AND end_date <= '2017-01-31' SELECT * FROM replace_data
此範例程式代碼會寫出 中的數據 replace_data
,驗證所有數據列是否符合述詞,並使用語意執行不可部分完成的取代 overwrite
。 如果作業中的任何值落在條件約束之外,此作業預設會失敗並出現錯誤。
您可以將此行為變更為 overwrite
述詞範圍內的值,以及 insert
落在指定範圍外的記錄。 若要這樣做,請使用下列其中一個設定,將 設定 spark.databricks.delta.replaceWhere.constraintCheck.enabled
為 false 來停用條件約束檢查:
Python
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", False)
Scala
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", false)
SQL
SET spark.databricks.delta.replaceWhere.constraintCheck.enabled=false
舊版行為
舊版預設行為只會 replaceWhere
覆寫數據分割數據行上符合述詞的數據。 使用這個舊版模型時,下列命令會以 中的數據,在 目標數據表中以 中的數據,以不可部分完成的方式取代目標數據表date
df
中的月份 1 月:
Python
(df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.table("people10m")
)
Scala
df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.table("people10m")
如果您想要回復到舊的行為,您可以停用 spark.databricks.delta.replaceWhere.dataColumns.enabled
旗標:
Python
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", False)
Scala
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", false)
SQL
SET spark.databricks.delta.replaceWhere.dataColumns.enabled=false
動態分割區覆寫
重要
這項功能處於公開預覽狀態。
Databricks Runtime 11.3 LTS 和更新版本支援 分割數據表的動態 分割覆寫模式。 對於具有多個數據分割的數據表,Databricks Runtime 11.3 LTS 和以下的數據表,只有在所有數據分割數據行都屬於相同數據類型時,才支援動態數據分割覆寫。
當處於動態數據分割覆寫模式時,作業會覆寫寫入認可新數據的每個邏輯分割區中的所有現有數據。 寫入不包含數據的任何現有邏輯分割區都保持不變。 只有在以覆寫模式寫入數據時,才適用此模式: INSERT OVERWRITE
在 SQL 中,或是使用 df.write.mode("overwrite")
寫入 DataFrame。
將 Spark 工作階段組態 spark.sql.sources.partitionOverwriteMode
設定為 dynamic
,以設定動態分割覆寫模式。 您也可以將 選項partitionOverwriteMode
設定DataFrameWriter
為 dynamic
來啟用此功能。 如果存在,查詢特定選項會覆寫會話組態中定義的模式。 partitionOverwriteMode
的預設值為 static
。
重要
驗證以動態分割區覆寫寫入的數據只會觸及預期的分割區。 不正確的分割區中的單一數據列可能會導致不小心覆寫整個分割區。
下列範例示範如何使用動態分割區覆寫:
SQL
SET spark.sql.sources.partitionOverwriteMode=dynamic;
INSERT OVERWRITE TABLE default.people10m SELECT * FROM morePeople;
Python
(df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
)
Scala
df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
注意
- 動態數據分割覆寫會與數據分割數據表的選項
replaceWhere
衝突。- 如果在 Spark 工作階段組態中啟用動態分割覆寫,而且
replaceWhere
會以DataFrameWriter
選項提供,則 Delta Lake 會根據replaceWhere
表達式覆寫數據(查詢特定選項覆寫工作階段組態)。 - 如果
DataFrameWriter
選項同時覆寫並replaceWhere
啟用動態分割區,您會收到錯誤。
- 如果在 Spark 工作階段組態中啟用動態分割覆寫,而且
- 您無法在使用動態分割覆寫時指定
overwriteSchema
為true
。