架構強制執行

Azure Databricks 會對 Delta Lake 資料表在寫入時強制執行結構描述,以驗證資料品質。 架構強制不適用於使用非 Delta 格式的資料表,例如 CSV 或 JSON 檔案在雲端儲存。

針對 INSERT 作業的結構描述強制執行

將數據插入資料表時,Azure Databricks 會強制執行下列規則:

  • 所有插入的數據行都必須存在於目標數據表中。
  • 所有數據行數據類型都必須符合目標數據表中的數據行數據類型。

備註

Azure Databricks 會嘗試安全地轉換欄位資料類型,以符合目標資料表。

INSERT 範例

以下範例會寫入至名為 enforce_demo 的受管理 Delta Lake 資料表。 要建立它,請執行以下操作:

CREATE OR REPLACE TABLE main.default.enforce_demo (id INT, name STRING, amount BIGINT);

以下 INSERT 情況失敗,因為 unknown_column 不存在於 enforce_demo中。 Azure Databricks 會傳回 UNRESOLVED_COLUMN.WITH_SUGGESTION 錯誤(SQLSTATE 42703),指出有效的資料行名稱:

INSERT INTO main.default.enforce_demo (id, unknown_column) VALUES (1, 'value');

以下 INSERT 的成功案例。 Azure Databricks 會安全地將整數42鑄造成BIGINT欄位的amount類型:

INSERT INTO main.default.enforce_demo (id, amount) VALUES (1, 42);

針對 MERGE 作業的結構描述強制執行

Azure Databricks 會在插入或更新數據作為 MERGE 作業的一部分時,強制執行下列規則:

  • 如果 source 語句中的數據類型不符合目標數據行,MERGE 嘗試安全地轉換數據行數據類型以符合目標數據表。
  • 或UPDATE動作的INSERT目標欄位必須存在於目標資料表中。
  • 使用 INSERT * 或 UPDATE SET *時:
    • 源數據集必須具有目標數據表中的所有數據行。
    • 強制執行會忽略來源資料集中不存在於目標資料表的欄位。

MERGE 範例

以下範例重複使用 enforce_demo 前一節的資料表,以及一個名為 enforce_source 來源資料表且多出一欄。 要建立來源資料表,請執行以下操作:

CREATE OR REPLACE TABLE main.default.enforce_source (id INT, name STRING, amount BIGINT, extra_col STRING);

INSERT INTO main.default.enforce_source VALUES (1, 'Alice', 100, 'x'), (2, 'Bob', 200, 'y');

以下 MERGE 會失敗,因為它將值指派給 unknown_column,而 unknown_column 在 enforce_demo 中不存在。 Azure Databricks 會回傳DELTA_MERGE_UNRESOLVED_EXPRESSION一個錯誤,並列出它能解決的欄位:

MERGE INTO main.default.enforce_demo AS t
USING main.default.enforce_source AS s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET t.unknown_column = s.name
WHEN NOT MATCHED THEN INSERT (id, unknown_column) VALUES (s.id, s.name);

表格 enforce_source 中包含一個 extra_col 欄位,但沒有 enforce_demo 。 以下搭配 INSERT * 的 MERGE 之所以成功,是因為來源包含所有目標欄位。 強制執行忽略 extra_col:

MERGE INTO main.default.enforce_demo AS t
USING main.default.enforce_source AS s
ON t.id = s.id
WHEN NOT MATCHED THEN INSERT *;

修改數據表架構

你可以用明確 ALTER TABLE 的語句或自動架構演化來更新資料表的結構。 請參閱 「更新資料表結構與結構演進」。

例如,要明確新增欄位:

ALTER TABLE catalog.schema.table_name ADD COLUMN new_column STRING;

要啟用寫入操作的自動結構演化,請設定以下 mergeSchema 選項:

SQL

SET spark.databricks.delta.schema.autoMerge.enabled = true;
INSERT INTO catalog.schema.table_name SELECT * FROM source_table;

Python

df.write.option("mergeSchema", "true").mode("append").saveAsTable("catalog.schema.table_name")

結構演化對 INSERT 和 MERGE 操作有特殊的語意。 請參閱 啟用架構演進。

外部數據表

如果你直接用 Azure Databricks 以外的外部用戶端修改外部資料表的元資料,或是透過路徑存取,Unity Catalog 不會自動將更新同步到結構中。 這可能會導致結構描述的強制套用無法正確運作。

執行 MSCK REPAIR TABLE <table-name> SYNC METADATA 以同步 Schema 與 Unity Catalog。 參見 REPAIR TABLE。