スキーマの適用

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 に列 idnameがあり、 source_tableidname、および 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を参照してください。