Delta Lake 列マッピングを使用した列の名前変更と削除
このページでは、Delta Lakeの列マッピングによって、データファイルを書き換えることなく、列を削除済みまたは名前変更済みとしてマークするメタデータのみの変更が可能になることについて説明します。
Databricks は Delta Lake テーブルの列マッピングをサポートしています。列マッピングにより、データファイルを書き換えずに、列を削除済みまたは名前変更済みとしてマークするメタデータのみの変更が可能になります。列マッピングでは、スペースなどのParquetで列名に使用できない文字も使用できます。これにより、列の名前を変更することなく、CSV または JSON データを直接Deltaに取り込むことができます。
前提条件と制限
カラムマッピングを有効にする前に、以下の制限事項をご理解ください。
- 列マッピングが有効なテーブルは、Databricks Runtime 10.4 LTS 以降でのみ読み取り可能です。
- 列マッピングを有効にすると中断する可能性があるもの:
- Delta Lake テーブルの読み取りにディレクトリ名に依存するレガシーワークロードカラムマッピングが有効になっているパーティションテーブルでは、パーティションディレクトリのカラム名の代わりにランダムなプレフィックスが使用されます。「Delta Lake と Parquet はパーティション分割戦略を共有しますか?」を参照してください。
- Delta チェンジデータフィードを使用するダウンストリームオペレーション列マッピングのあるテーブルを参照してください。
- LakeFlow Spark宣言型パイプラインなど、Delta Lakeテーブルからのストリーミング読み取り。列マッピングとストリーミングを参照してください。
列マッピングを有効にする
次のコマンドを使用して、新しいテーブルでidモードの列マッピングを有効にします。
CREATE table <table-name> (
id INT,
name STRING
)
USING DELTA
TBLPROPERTIES (
'delta.columnMapping.mode' = 'id'
);
既存のテーブルでnameモードを使用して列マッピングを有効にするには、次のコマンドを使用します。
ALTER TABLE <table-name> SET TBLPROPERTIES (
'delta.columnMapping.mode' = 'name'
)
列マッピングモードの詳細については、「列マッピングモード」を参照してください。
列マッピングには、次の Delta プロトコルが必要です。
- Reader バージョン 2 以降
- Writer バージョン 5 以降。
Delta Lake 機能の互換性とプロトコルを参照してください。
列の名前を変更する
Databricks Runtime 10.4 LTS 以降で利用可能です。
Delta Lake テーブルで列マッピングが有効になっている場合、列の名前を変更できます:
ALTER TABLE <table-name> RENAME COLUMN old_col_name TO new_col_name
さらに例については、テーブル スキーマの更新を参照してください。
列の削除
Databricks Runtime 11.3 LTS以降で利用可能です。
Delta Lake テーブルで列マッピングが有効になっている場合、1つ以上の列を削除できます:
ALTER TABLE table_name DROP COLUMN col_name
ALTER TABLE table_name DROP COLUMNS (col_name_1, col_name_2, ...)
詳細については、テーブル スキーマの更新を参照してください。
列マッピング モード
delta.columnMapping.modeテーブルプロパティを使用すると、データファイルを書き換えることなく、列を削除済みまたは名前変更済みとしてマークするメタデータのみの変更を行うことができます。次のモードが利用可能です。
none(デフォルト):列マッピングが有効になっていません。列名はParquetの命名制約を受けます。- 「
name」 :これにより、メタデータのみの列の名前変更と削除が可能になり、列名に特殊文字を使用できるようになります。nameモードは、新規テーブルおよび既存テーブルに設定できます。 - 「
id」 :これにより、メタデータのみの列の名前変更と削除が可能になり、列名に特殊文字を使用できるようになります。idモードは、テーブル作成時に設定する必要があり、既存のテーブルでは設定できません。
Databricks では、互換性のため、ほとんどのユースケースで id モードを推奨しています。ただし、delta.columnMapping.modeに値を指定しない場合で、かつUniFormなどのIceberg互換性機能を有効にすると、nameモードが自動的に設定されます。
列名でサポートされている文字
Delta Lake テーブルで列マッピングが有効になっている場合、列名にスペースとこれらの文字のいずれかを含めることが可能です:,;{}()\n\t=。
列マッピングの削除
次のコマンドを使用して、テーブルから列マッピングを削除できます。
ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.columnMapping.mode' = 'none')
列マッピングを削除すると、物理列名が論理名に置き換えられるように、すべてのデータファイルが書き換えられます。この操作は、行レベルまたは物理的な競合の解決をサポートしていません。
並列書き込み操作により、ConcurrentModificationExceptionが発生します。列マッピングを削除する前に:
- ストリーミングジョブやETLパイプラインを含む、すべての並列書き込み操作を停止します。
- テーブルで予測的最適化を無効にする。
- 大規模なテーブルについては、システムの負荷が低い時間帯にこの操作をスケジュールしてください。
テーブルプロトコルのダウングレードをサポートする別の方法については、カラムマッピングを無効にするを参照してください。
列マッピングの無効化
Databricks Runtime 15.3以降では、DROP FEATUREコマンドを使用して列マッピングを削除し、テーブルプロトコルをダウングレードできます。古いリーダーとの互換性のためにプロトコル バージョンをダウングレードする必要がある場合は、列マッピングの削除ではなくこのアプローチを使用してください。
テーブルからカラムマッピングを削除しても、パーティションテーブルのディレクトリ名で使用されているランダムなプレフィックスは削除されません。
Delta Lake テーブル機能の削除およびテーブル プロトコルのダウングレードを参照してください。
列マッピングとストリーミング
列マッピングが有効な Delta Lake テーブルからストリーミングを有効にするには、スキーマトラッキングの場所を指定できます。これにより、非加算的なスキーマ変更によってストリームが破損する可能性があった問題が解消されます。
データソースに対する各ストリーミング読み取りには、独自の schemaTrackingLocation を指定する必要があります。指定されたschemaTrackingLocationは、ストリーミング書き込み用のターゲットテーブルのcheckpointLocationに指定されたディレクトリに含める必要があります。複数のソース Delta Lake テーブルからのデータを組み合わせるストリーミングワークロードでは、各ソース テーブルに対して checkpointLocation 内に一意のディレクトリを指定する必要があります。ストリーミング Delta Lake オプションの完全なリストについては、「Delta Lake」を参照してください。
実行中のジョブで列マッピングを有効にする
実行中のストリーミングジョブで列マッピングを有効にするには:
- ジョブを停止します。
- テーブルで列マッピングを有効にしてください。
- ジョブを再起動します(最初の再起動でカラムマッピングを初期化します)。
- ジョブを再度再起動してください(2回目の再起動でスキーマ変更を有効化します)
それ以降のスキーマ変更(列の追加、列の削除、列の型の変更)でも、ジョブの再起動が必要です。
スキーマ追跡ロケーションの指定
次の例では、列マッピングを使用する Delta Lake テーブルからのストリーミング読み取りに schemaTrackingLocation を指定する方法を示します。
checkpoint_path = "/path/to/checkpointLocation"
(spark.readStream
.option("schemaTrackingLocation", checkpoint_path)
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpoint_path)
.toTable("output_table")
)