使用 Delta Lake 數據行對應重新命名和卸除數據行

重要

這項功能處於公開預覽狀態

Azure Databricks 支援 Delta Lake 數據表的數據行對應,這可讓僅限元數據的變更將數據行標示為已刪除或重新命名,而不需重寫數據檔。 它也允許使用者使用 Parquet 不允許的字元來命名 Delta 數據表數據行,例如空格,讓使用者可以直接將 CSV 或 JSON 數據擷取到 Delta,而不需要因為先前的字元條件約束而重新命名數據行。

重要

啟用數據行對應也會啟用隨機檔案前置詞,以移除使用Hive樣式的數據分割來探索數據的能力。 請參閱 Delta Lake 和 Parquet 共用分割策略嗎?

在數據表上啟用數據行對應可能會中斷依賴差異變更數據摘要的下游作業。 請參閱 變更已啟用數據行對應之數據表的數據摘要限制。

在數據表上啟用數據行對應可能會中斷從 Delta 數據表讀取為來源的串流,包括在 Delta 實時數據表中。 請參閱使用資料行對應和結構描述變更進行串流

如何啟用 Delta Lake 數據行對應

重要

啟用數據表的數據行對應會升級 Delta 數據表版本。 此通訊協議升級無法復原。 已啟用數據行對應的數據表只能在 Databricks Runtime 10.4 LTS 和更新版本讀取。

資料行對應需要下列差異通訊協定:

  • 讀取器第 2 版或更新版本。
  • 寫入器第 5 版或更新版本。

針對具有必要通訊協定版本的 Delta 數據表,您可以將 設定 delta.columnMapping.modename來啟用資料行對應。

您可以使用下列命令來升級資料表版本並啟用資料行對應:

  ALTER TABLE <table-name> SET TBLPROPERTIES (
    'delta.minReaderVersion' = '2',
    'delta.minWriterVersion' = '5',
    'delta.columnMapping.mode' = 'name'
  )

注意

啟用資料行之後,您無法關閉資料行對應。 如果您嘗試設定 'delta.columnMapping.mode' = 'none',就會收到錯誤。

重新命名資料行

注意

適用於 Databricks Runtime 10.4 LTS 和更新版本。

針對 Delta 資料表啟用資料行對應時,您可以重新命名資料行:

ALTER TABLE <table-name> RENAME COLUMN old_col_name TO new_col_name

如需更多範例,請參閱 更新 Delta Lake 數據表架構

卸除資料行

注意

適用於 Databricks Runtime 11.3 LTS 和更新版本。

針對 Delta 資料表啟用資料行對應時,您可以卸載一或多個資料行:

ALTER TABLE table_name DROP COLUMN col_name
ALTER TABLE table_name DROP COLUMNS (col_name_1, col_name_2, ...)

如需詳細資訊,請參閱 更新 Delta Lake 數據表架構

數據行名稱中支援的字元

針對 Delta 資料表啟用資料行對應時,您可以在資料表的數據行名稱中包含空格和其中任何字元: ,;{}()\n\t=

使用數據行對應和架構變更進行串流

重要

這項功能在 Databricks Runtime 13.3 LTS 和更新版本中處於公開預覽狀態。

您可以提供架構追蹤位置,以啟用來自 Delta 資料表的串流,並啟用資料行對應。 這克服了非加總架構變更可能會導致數據流中斷的問題。

針對數據源讀取的每個串流都必須有自己的 schemaTrackingLocation 指定。 指定的 schemaTrackingLocation 必須包含在針對 checkpointLocation 數據流寫入之目標數據表 的 所指定的目錄中。

注意

針對結合多個來源 Delta 數據表數據的串流工作負載,您必須為每個源數據表指定 內 checkpointLocation 的唯一目錄。

選項 schemaTrackingLocation 可用來指定架構追蹤的路徑,如下列程式代碼範例所示:

checkpoint_path = "/path/to/checkpointLocation"

(spark.readStream
  .option("schemaTrackingLocation", checkpoint_path)
  .table("delta_source_table")
  .writeStream
  .option("checkpointLocation", checkpoint_path)
  .toTable("output_table")
)