Delta Lake 列マッピングを使用すると、メタデータのみの変更で、データ ファイルを書き換えることなく列の名前を変更または削除できます。 列マッピングでは、スペースなどの列名で Parquet でサポートされていない文字も使用できるため、列の名前を変更せずに CSV または JSON データを Delta Lake に直接取り込むことができます。
前提 条件
列マッピングを有効にする前に、 制限事項を確認してください。
列マッピングには、次のものが必要です。
- デルタ プロトコル: リーダー バージョン 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モードはテーブルの作成時に設定する必要があり、既存のテーブルでは設定できません。
Note
Databricks では、互換性のためにほとんどのユース ケースで id モードをお勧めします。 ただし、 name モードは、 delta.columnMapping.mode の値を指定せず、 UniForm などの Iceberg 互換機能を有効にした場合に自動的に設定されます。
列名でサポートされている文字
Delta Lake テーブルに対して列マッピングが有効になっている場合は、列名にスペースと任意の文字 ( ,;{}()\n\t=) を含めることができます。
列マッピングの削除
Warning
列マッピングを削除すると、物理列名を論理名に置き換えるために、すべてのデータ ファイルが書き換えられます。 この操作では、行レベルまたは物理的な競合解決はサポートされていません。
同時書き込み操作では、 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 がスキーマの変更を追跡し、ストリームエラーを防ぐことができます。
Configuration
schemaTrackingLocationを構成する場合:
- ソース テーブルから読み取られた各ストリーミングには、独自の
schemaTrackingLocationが必要です。 -
schemaTrackingLocationは、ストリーミング書き込みターゲットのcheckpointLocationディレクトリ内にある必要があります。 - 複数のソース テーブルから読み取るワークロードの場合は、ソースごとに
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 のパーティション分割の互換性を参照してください。
- 変更データ フィードを使用した下流処理。 列マッピングを含むテーブルを参照してください。
- Delta Lake テーブルからのストリーミング読み取り(Lakeflow Spark 宣言型パイプラインでの読み取りを含む) 列マッピングとストリーミングを参照してください。