Delta Lake の列マッピングを使用して列の名前変更と削除を行う

重要

この機能はパブリック プレビュー段階にあります。

Azure Databricks では Delta Lake テーブルの列マッピングがサポートされています。これにより、データ ファイルを書き換えることなく、メタデータのみの変更で、列を削除または名前変更済みとしてマークできます。 また、ユーザーは、Parquet で許可されていないスペースなどの文字を使って、Delta テーブルの列に名前を付けることができます。そのため、ユーザーは、以前は文字の制約のために必要であった列の名前の変更を行うことなく、CSV または JSON のデータを Delta に直接取り込むことができます。

重要

列マッピングを有効にすると、ランダムなファイル プレフィックスも有効になり、Hive スタイルのパーティション分割を使用してデータを探索する機能が削除されます。 「「Delta Lake と Parquet ではパーティション分割戦略が共有されますか?」を参照してください。

テーブルで列マッピングを有効にすると、Delta 変更データ フィードに依存するダウンストリーム操作が中断される可能性があります。 「列マッピングが有効になっているテーブルのデータ フィードの制限を変更する」を参照してください。

テーブルで列マッピングを有効にすると、Delta Live Tables を含め、ソースとして Delta テーブルから読み取られるストリーミングが中断される可能性があります。 「列マッピングとスキーマの変更が伴うストリーミング」を参照してください。

Delta Lake の列マッピングを有効にする方法

重要

テーブルの列マッピングを有効にすると、Delta テーブルのバージョンがアップグレードされます。 このプロトコルのアップグレードは元に戻すことができません。 列マッピングが有効になっているテーブルは、Databricks Runtime 10.4 LTS 以降でのみ読み取ることができます。

列マッピングには、次の Delta プロトコルが必要です。

  • Reader バージョン 2 以降。
  • Writer バージョン 5 以降。

必要なプロトコル バージョンを備えた Delta テーブルの場合は、delta.columnMapping.modename に設定することで、列マッピングを有効にできます。

次のコマンドを使って、テーブルのバージョンをアップグレードし、列マッピングを有効にすることができます。

  ALTER TABLE <table-name> SET TBLPROPERTIES (
    'delta.minReaderVersion' = '2',
    'delta.minWriterVersion' = '5',
    'delta.columnMapping.mode' = 'name'
  )

注意

列マッピングは、有効にした後で無効にすることはできません。 'delta.columnMapping.mode' = 'none' を設定しようとすると、エラーが発生します。

列の名前変更

Note

Databricks Runtime 10.4 LTS 以降で使用できます。

Delta テーブルで列マッピングが有効になっている場合は、列の名前を変更できます。

ALTER TABLE <table-name> RENAME COLUMN old_col_name TO new_col_name

その他の例については、「Delta Lake のテーブル スキーマを更新する」を参照してください。

列の削除

Note

Databricks Runtime 11.3 LTS 以降で使用できます。

Delta テーブルで列マッピングが有効になっている場合は、1 つ以上の列を削除できます。

ALTER TABLE table_name DROP COLUMN col_name
ALTER TABLE table_name DROP COLUMNS (col_name_1, col_name_2, ...)

詳細については、「Delta Lake のテーブル スキーマを更新する」を参照してください。

列名でサポートされる文字

Delta テーブルで列マッピングが有効になっている場合は、テーブルの列名にスペースと次の任意の文字を含めることができます: ,;{}()\n\t=

列マッピングとスキーマの変更が伴うストリーミング

重要

この機能は、Databricks Runtime 13.3 LTS 以降でパブリック プレビュー段階にあります。

スキーマ追跡の場所を指定して、列マッピングが有効になっている Delta テーブルからのストリーミングを有効にすることができます。 これにより、非加法スキーマの変更によってストリームが破損する可能性がある問題が克服されます。

データ ソースに対する各ストリーミングの読み込みには、独自の schemaTrackingLocation を指定する必要があります。 指定された schemaTrackingLocation は、ストリーミング書き込み用のターゲット テーブルの checkpointLocation に指定されたディレクトリ内に含まれている必要があります。

注意

複数ソースの Delta テーブルからのデータを結合するストリーミング ワークロードの場合は、ソース テーブルごとの checkpointLocation 内の一意のディレクトリを指定する必要があります。

次のコード例に示すように、オプション schemaTrackingLocation はスキーマ追跡のパスを指定するために使用されます。

checkpoint_path = "/path/to/checkpointLocation"

(spark.readStream
  .option("schemaTrackingLocation", checkpoint_path)
  .table("delta_source_table")
  .writeStream
  .option("checkpointLocation", checkpoint_path)
  .toTable("output_table")
)