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。