スキーマ強制
Databricksは、Delta Lakeテーブルへの書き込み時にスキーマを強制することで、データ品質を検証します。スキーマ強制は、クラウドストレージ内のCSVやJSONファイルなど、非Delta形式を使用するテーブルには適用されません。
INSERT操作のスキーマ強制
Databricks では、テーブルにデータを挿入するときに次のルールが適用されます。
- 挿入されたすべての列は、ターゲット表に存在している必要があります。
- すべての列データ型は、ターゲット表の列データ型と一致する必要があります。
Databricks は、ターゲット テーブルに一致するように列のデータ型を安全にキャストしようとします。
INSERT の例
たとえば、ターゲットテーブルに存在しない列を含む行を挿入すると失敗します。
-- Fails: unknown_column does not exist in target_table
INSERT INTO catalog.schema.target_table (id, unknown_column) VALUES (1, 'value');
互換性のある型キャストでの挿入が成功しました:
-- Succeeds: integer 42 is safely cast to BIGINT
INSERT INTO catalog.schema.target_table (id, bigint_column) VALUES (1, 42);
MERGE操作のスキーマ強制
Databricks では、 MERGE 操作の一部としてデータを挿入または更新するときに、次のルールが適用されます。
- ソース ステートメントのデータ・タイプがターゲット・カラムと一致しない場合、
MERGEはカラム・データ・タイプをターゲット・テーブルと一致するように安全にキャストしようとします。 UPDATEまたはINSERTアクションのターゲットカラムは、ターゲットテーブルに存在する必要があります。INSERT *またはUPDATE SET *を使用する場合:- ソース データセットには、ターゲット テーブルに存在するすべての列が含まれている必要があります。
- 適用により、ターゲットテーブルに存在しないソースデータセットの列は無視されます。
MERGE の例
たとえば、次のMERGEは、クエリがunknown_columnに値を挿入しようとするものの、その値がtarget_tableに存在しないため、失敗します。
MERGE INTO catalog.schema.target_table AS t
USING catalog.schema.source_table AS s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET t.unknown_column = s.value
WHEN NOT MATCHED THEN INSERT (id, unknown_column) VALUES (s.id, s.value);
別の例では、target_tableにidとnameの列があり、source_tableにid、name、extra_colがあるとします。INSERT *を使用する以下のMERGEは、ソース内のextra_colを無視し、すべてのターゲットカラムがソースに存在するため成功します。
MERGE INTO catalog.schema.target_table AS t
USING catalog.schema.source_table 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
- Python
SET spark.databricks.delta.schema.autoMerge.enabled = true;
INSERT INTO catalog.schema.table_name SELECT * FROM source_table;
df.write.option("mergeSchema", "true").mode("append").saveAsTable("catalog.schema.table_name")
スキーマ進化には、 INSERTおよびMERGE操作に対する特別なセマンティクスがあります。「スキーマ進化を有効にする」を参照してください。
外部テーブル
Databricks の外部にある外部クライアントで、またはパスベースのアクセスを使用して、外部テーブルのメタデータを直接変更した場合、Unity Catalog はスキーマへの更新を自動的に同期しません。これにより、スキーマ強制が正しく適用されなくなる可能性があります。
MSCK REPAIR TABLE <table-name> SYNC METADATA を実行してスキーマを Unity Catalog に同期します。REPAIR TABLEを参照してください。