Delta Lake 列マッピングを使用した列の名前変更と削除
Delta Lake 列マッピングは、データファイルを書き換えることなく、列の名前変更または削除のメタデータのみの変更を可能にします。列マッピングを使用すると、列名でParquetがサポートしていないスペースなどの文字も使用できます。そのため、列名を変更することなく、CSVまたはJSONデータをDelta Lakeに直接取り込むことができます。
前提条件
列マッピングを有効にする前に、制限事項を確認してください。
列マッピングには、以下が必要です。
- Delta プロトコル: リーダーバージョン 2 以降、およびライターバージョン 5 以降。Delta Lake 機能の互換性とプロトコルを参照してください。
- 列マッピングが有効なテーブルの読み取りには、Databricks Runtime 10.4 LTS 以降が必要です。
列マッピングを有効にする
次のコマンドを使用して、新しいテーブルで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 Lake テーブルで列マッピングが有効になっている場合、列の名前を変更できます:
ALTER TABLE <table-name> RENAME COLUMN old_col_name TO new_col_name
その他の例については、スキーマ進化によるテーブルスキーマの更新を参照してください。
列の削除
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=。
列マッピングの削除
列マッピングを削除すると、物理列名が論理名に置き換えられるように、すべてのデータファイルが書き換えられます。この操作は、行レベルまたは物理的な競合の解決をサポートしていません。
並列書き込み操作によりConcurrentModificationExceptionが発生します。
列マッピングを削除する前に:
- ストリーミングジョブやETLパイプラインを含む、すべての並列書き込み操作を停止します。
- テーブルで予測的最適化をオフにしてください。
- 大規模なテーブルについては、システムの負荷が低い時間帯にこの操作をスケジュールしてください。
次のコマンドを使用して、テーブルから列マッピングを削除できます。
ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.columnMapping.mode' = 'none')
列マッピングを削除し、テーブルプロトコルをダウングレードするには、互換性の維持を参照してください。
互換性を維持する
Databricks Runtime 15.4 LTS以降では、DROP FEATURE コマンドを使用してカラムマッピングを削除し、テーブルプロトコルをダウングレードすることで、Databricks Runtime 10.3以前を使用しているリーダーとの互換性を維持できます。
テーブルからカラムマッピングを削除しても、パーティションテーブルのディレクトリ名で使用されているランダムなプレフィックスは削除されません。
Delta Lake テーブル機能の削除およびテーブル プロトコルのダウングレードを参照してください。
列マッピングとストリーミング
列の名前変更や削除などの非追加的なスキーマ変更は、ストリーミング読み取りを中断させる可能性があります。schemaTrackingLocationを使用して、Delta Lakeがスキーマ変更を追跡し、ストリームの障害を防ぐことができます。
構成
schemaTrackingLocationを構成する際:
- ソーステーブルからの各ストリーミング読み取りには、独自の
schemaTrackingLocationが必要です。 - ストリーミング書き込みターゲットの
checkpointLocationディレクトリ内にschemaTrackingLocationがある必要があります。 - 複数のソーステーブルから読み込むワークロードの場合、
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")
)
制限事項
列マッピングを有効にすると、以下が中断される可能性があります。
- Delta Lake テーブルの読み取りにディレクトリ名に依存するレガシーワークロードカラムマッピングが有効になっているパーティションテーブルでは、パーティションディレクトリのカラム名の代わりにランダムなプレフィックスが使用されます。「Delta Lake と Parquet はパーティション分割戦略を共有しますか?」を参照してください。
- チェンジデータフィードを使用するダウンストリームオペレーション列マッピングのあるテーブルを参照してください。
- LakeFlow Spark宣言型パイプラインなど、Delta Lakeテーブルからのストリーミング読み取り。列マッピングとストリーミングを参照してください。