Azure Databricksは、Delta Lake テーブルの書き込み時にスキーマを適用することで、データ品質を検証します。 スキーマの適用は、CSV やクラウド ストレージ内の JSON ファイルなど、差分以外の形式を使用するテーブルには適用されません。
INSERT操作に対するスキーマの適用
Azure Databricks では、テーブルにデータを挿入するときに、次の規則が適用されます。
- 挿入されたすべての列がターゲット テーブルに存在する必要があります。
- すべての列データ型は、ターゲット テーブルの列データ型と一致する必要があります。
手記
Azure Databricks は、ターゲット テーブルに一致するように列データ型を安全にキャストしようとします。
INSERT の例
以下の例は、管理されたデルタレイクテーブルに書き込むものです enforce_demo。 作成するには、以下を実行します:
CREATE OR REPLACE TABLE main.default.enforce_demo (id INT, name STRING, amount BIGINT);
次のINSERTは、enforce_demoには存在しないため失敗しますunknown_column。 Azure Databricks は有効な列名を示唆するUNRESOLVED_COLUMN.WITH_SUGGESTIONエラー(SQLSTATE 42703)を返します。
INSERT INTO main.default.enforce_demo (id, unknown_column) VALUES (1, 'value');
次の INSERT は成功します。 Azure Databricks 整数42をamount列のBIGINT型に安全にキャストします:
INSERT INTO main.default.enforce_demo (id, amount) VALUES (1, 42);
MERGE操作に対するスキーマの適用
Azure Databricks では、MERGE 操作の一部としてデータを挿入または更新するときに、次の規則が適用されます。
- ソース ステートメントのデータ型がターゲット列と一致しない場合、
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は、enforce_demoには存在しない unknown_column に割り当てるため失敗します。 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表にはenforce_demoにはないextra_col列が含まれています。 次の MERGE と INSERT * は、ソースにすべてのターゲット列が含まれているため、正常に実行されます。 執行は 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 カタログはスキーマに対する更新を自動的に同期しません。 これにより、スキーマの適用が正しく適用されない可能性があります。
MSCK REPAIR TABLE <table-name> SYNC METADATAを実行して、スキーマを Unity カタログと同期します。
REPAIR TABLEを参照してください。