共用方式為


選擇性地使用 Delta Lake 覆寫數據

Azure Databricks 利用 Delta Lake 功能來支持兩個不同的選擇性覆寫選項:

  • 選項會 replaceWhere 以不可部分完成的方式取代符合指定述詞的所有記錄。
  • 您可以根據資料表使用動態分割覆寫的方式來取代資料目錄。

針對大部分的作業,Databricks 建議使用 replaceWhere 來指定要覆寫的數據。

重要

如果數據遭到意外覆寫,您可以使用 還原 來復原變更。

使用任意選擇性覆寫 replaceWhere

您可以選擇性地只覆寫符合任意表達式的數據。

注意

SQL 需要 Databricks Runtime 12.2 LTS 或更新版本。

下列命令會以 中的數據,在目標數據表中以 中的數據,以不可部分完成的方式取代目標數據表start_datereplace_data中的事件:

Python

(replace_data.write
  .mode("overwrite")
  .option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
  .save("/tmp/delta/events")
)

Scala

replace_data.write
  .mode("overwrite")
  .option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
  .save("/tmp/delta/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 覆寫數據分割數據行上符合述詞的數據。 使用這個舊版模型時,下列命令會以 中的數據,在 目標數據表中以 中的數據,以不可部分完成的方式取代目標數據表datedf中的月份 1 月:

Python

(df.write
  .mode("overwrite")
  .option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
  .save("/tmp/delta/people10m")
)

Scala

df.write
  .mode("overwrite")
  .option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
  .save("/tmp/delta/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設定DataFrameWriterdynamic來啟用此功能。 如果存在,查詢特定選項會覆寫會話組態中定義的模式。 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 啟用動態分割區,您會收到錯誤。
  • 您無法在使用動態分割覆寫時指定 overwriteSchematrue