スキーマの適用

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 整数42amount列の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列が含まれています。 次の MERGEINSERT * は、ソースにすべてのターゲット列が含まれているため、正常に実行されます。 執行は 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を参照してください。