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

プレビュー

この機能はパブリックプレビュー段階です。

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 プロトコルが必要です。

  • リーダーバージョン2以上。

  • ライター バージョン 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'を設定しようとすると、エラーが発生します。

の名前を変更する

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

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

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

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

をドロップする

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")
)