メインコンテンツまでスキップ

スキーマ強制

Databricksは、Delta Lakeテーブルへの書き込み時にスキーマを強制することで、データ品質を検証します。スキーマ強制は、クラウドストレージ内のCSVやJSONファイルなど、非Delta形式を使用するテーブルには適用されません。

INSERT操作のスキーマ強制

Databricks では、テーブルにデータを挿入するときに次のルールが適用されます。

  • 挿入されたすべての列は、ターゲット表に存在している必要があります。
  • すべての列データ型は、ターゲット表の列データ型と一致する必要があります。
注記

Databricks は、ターゲット テーブルに一致するように列のデータ型を安全にキャストしようとします。

INSERT の例

たとえば、ターゲットテーブルに存在しない列を含む行を挿入すると失敗します。

SQL
-- Fails: unknown_column does not exist in target_table
INSERT INTO catalog.schema.target_table (id, unknown_column) VALUES (1, 'value');

互換性のある型キャストでの挿入が成功しました:

SQL
-- 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に存在しないため、失敗します。

SQL
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_tableidnameの列があり、source_tableidnameextra_colがあるとします。INSERT *を使用する以下のMERGEは、ソース内のextra_colを無視し、すべてのターゲットカラムがソースに存在するため成功します。

SQL
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 ステートメントまたは自動スキーマ進化を使用して、テーブルのスキーマを更新できます。スキーマ進化を使用してテーブルスキーマを更新するを参照してください。

たとえば、列を明示的に追加するには:

SQL
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;

スキーマ進化には、 INSERTおよびMERGE操作に対する特別なセマンティクスがあります。「スキーマ進化を有効にする」を参照してください。

外部テーブル

Databricks の外部にある外部クライアントで、またはパスベースのアクセスを使用して、外部テーブルのメタデータを直接変更した場合、Unity Catalog はスキーマへの更新を自動的に同期しません。これにより、スキーマ強制が正しく適用されなくなる可能性があります。

MSCK REPAIR TABLE <table-name> SYNC METADATA を実行してスキーマを Unity Catalog に同期します。REPAIR TABLEを参照してください。