Azure Databricksは、Delta Lake テーブルの書き込み時にスキーマを適用することで、データ品質を検証します。 スキーマの適用は、CSV やクラウド ストレージ内の JSON ファイルなど、差分以外の形式を使用するテーブルには適用されません。
INSERT操作に対するスキーマの適用
Azure Databricks では、テーブルにデータを挿入するときに、次の規則が適用されます。
- 挿入されたすべての列がターゲット テーブルに存在する必要があります。
- すべての列データ型は、ターゲット テーブルの列データ型と一致する必要があります。
手記
Azure 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 操作に対するスキーマの適用
Azure 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があるとします。 次のMERGEINSERT *を使用すると、ソース内の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
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を参照してください。