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

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

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

important

列マッピングが有効になっているテーブルは、Databricks Runtime 10.4 LTS 以降でのみ読み取ることができます。

Delta テーブルの読み取りにディレクトリ名に依存するレガシ パターンを使用している場合、列マッピングを有効にすると、レガシ ワークロードが中断される可能性があります。カラムマッピングが有効になっているパーティションテーブルでは、パーティションディレクトリのカラム名の代わりにランダムなプレフィックスが使用されます。「Delta Lake と Parquet はパーティション分割戦略を共有しますか?」を参照してください。

テーブルで列マッピングを有効にすると、 Delta チェンジデータフィードに依存するダウンストリームオペレーションが中断される可能性があります。 カラムマッピングが有効になっているテーブルのチェンジデータフィードの制限を参照してください。

テーブルで列マッピングを有効にすると、 Delta テーブルからのストリーム読み取り (宣言型パイプラインを含む) が中断され LakeFlow 可能性があります。 列マッピングとスキーマの変更によるストリーミングを参照してください。

列マッピングを有効にする

次のコマンドを使用して、列マッピングを有効にします。

SQL
  ALTER TABLE <table-name> SET TBLPROPERTIES (
'delta.columnMapping.mode' = 'name'
)

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

  • リーダーのバージョン2以上。
  • Writer バージョン 5 以降。

Delta Lake 機能の互換性とプロトコルを参照してください。

列マッピングを無効にする

Databricks Runtime 15.3 以降では、 DROP FEATURE コマンドを使用して、テーブルから列マッピングを削除し、テーブル プロトコルをダウングレードできます。

important

テーブルからカラムマッピングを削除しても、パーティション化されたテーブルのディレクトリ名に使用されているランダムなプレフィックスは削除されません。

Delta Lake テーブル機能の削除およびテーブル プロトコルのダウングレードを参照してください。

列の名前を変更する

注記

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

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

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

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

列の削除

注記

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

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

SQL
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=のいずれかの文字を含めることができます。

列マッピングとスキーマ変更によるストリーミング

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

データソースに対して読み取られる各ストリーミングには、独自の schemaTrackingLocation を指定する必要があります。 指定された schemaTrackingLocation は、ストリーミング書き込みのターゲットテーブルの checkpointLocation に指定されたディレクトリ内に含まれている必要があります。複数のソース Delta テーブルからのデータを結合するストリーミング ワークロードの場合は、ソース テーブルごとに checkpointLocation 内の一意のディレクトリを指定する必要があります。

important

現在実行中のジョブで列マッピングを有効にするには、ジョブを少なくとも 2 回停止して再始動する必要があります (つまり、2 回再始動します)。

  • 最初の再起動では、列マッピングが初期化されます。
  • 2 回目の再起動により、スキーマの変更が有効になります。

さらにスキーマを変更した場合 (列の追加や削除、列の種類の変更など) も、ジョブの再起動が必要になります。

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

Python
checkpoint_path = "/path/to/checkpointLocation"

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