Delta Lake 列マッピングを使用した列の名前変更と削除
このページでは、Delta Lake 列マッピングを使用して、メタデータのみの変更によって、データ ファイルを書き換えずに列を削除または名前変更としてマークする方法について説明します。
Databricks は Delta Lake テーブルの列マッピングをサポートしています。列マッピングにより、データ ファイルを書き換えずに、メタデータのみの変更で列を削除または名前変更としてマークできます。列マッピングを使用すると、スペースなど、Parquet で列名に許可されていない文字を使用することもできます。これにより、列の名前を変更せずに、CSV または JSON データを Delta に直接取り込むことができます。
前提条件と制限事項
列マッピングを有効にする前に、次の制限事項を理解してください。
- 列マッピングが有効になっているテーブルは、Databricks Runtime 10.4 LTS 以降でのみ読み取ることができます。
- 列マッピングを有効にすると、次のことが壊れる可能性があります:
- Deltaテーブルの読み取りにディレクトリ名に依存する従来のワークロード。 列マッピングを持つパーティション テーブルでは、パーティション ディレクトリの列名の代わりにランダムなプレフィックスが使用されます。「Delta Lake と Parquet はパーティション戦略を共有していますか?」を参照してください。
- Deltaチェンジデータフィードを使用したダウンストリーム操作。 「列マッピングのあるテーブルの変更データフィードの制限」を参照してください。
- ストリーミングは、 LakeFlow Spark宣言型パイプラインなどのDeltaテーブルから読み取ります。 列マッピングとストリーミングを参照してください。
列マッピングを有効にする
次のコマンドを使用して、列マッピングを有効にします。
ALTER TABLE <table-name> SET TBLPROPERTIES (
'delta.columnMapping.mode' = 'name'
)
列マッピングには、次の Delta プロトコルが必要です。
- リーダーバージョン2以上
- Writerバージョン5以上
Delta Lake 機能の互換性とプロトコルを参照してください。
列の名前を変更する
Databricks Runtime 10.4 LTS 以降で使用できます。
Delta テーブルで列マッピングが有効になっている場合は、列の名前を変更できます。
ALTER TABLE <table-name> RENAME COLUMN old_col_name TO new_col_name
その他の例については、 「テーブル スキーマの更新」を参照してください。
列を削除する
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 テーブルで列マッピングが有効になっている場合、列名にスペースと次の文字を含めることができます: ,;{}()\n\t= 。
列マッピングを削除する
次のコマンドを使用して、テーブルから列マッピングを削除できます。
ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.columnMapping.mode' = 'none')
列マッピングを削除すると、すべてのデータ ファイルが書き換えられ、物理列名が論理名に置き換えられます。この操作では、行レベルまたは物理的な競合解決はサポートされていません。
書き込み操作ではConcurrentModificationExceptionが発生します。 列マッピングを削除する前に:
- ストリーミング ジョブやETLパイプラインを含むすべてのライブラリ書き込み操作を停止します。
- テーブル上の予測的最適化を無効にします。
- 大きなテーブルの場合は、アクティビティが少ない時間帯にこの操作をスケジュールします。
テーブル プロトコルのダウングレードをサポートする代替アプローチについては、 「列マッピングを無効にする」を参照してください。
列マッピングを無効にする
Databricks Runtime 15.3 以降では、 DROP FEATUREコマンドを使用して列マッピングを削除し、テーブル プロトコルをダウングレードできます。古いリーダーとの互換性のためにプロトコル バージョンをダウングレードする必要がある場合は、列マッピングを削除する代わりにこのアプローチを使用します。
テーブルから列マッピングを削除しても、パーティション テーブルのディレクトリ名で使用されるランダムなプレフィックスは削除されません。
Delta Lake テーブル機能の削除およびテーブル プロトコルのダウングレードを参照してください。
列マッピングとストリーミング
列マッピングが有効になっている Delta テーブルからのストリーミングを有効にするには、スキーマ追跡の場所を指定できます。これにより、非加法的なスキーマ変更によってストリームが壊れる可能性がある問題が解決されます。
データソースに対して読み取られる各ストリーミングには、独自の schemaTrackingLocation を指定する必要があります。 指定された schemaTrackingLocation は、ストリーミング書き込みのターゲットテーブルの checkpointLocation に指定されたディレクトリ内に含まれている必要があります。複数のソース Delta テーブルからのデータを結合するストリーミング ワークロードの場合は、ソース テーブルごとに checkpointLocation 内の一意のディレクトリを指定する必要があります。
実行中のジョブで列マッピングを有効にする
実行中のストリーミング ジョブで列マッピングを有効にするには:
- ジョブを停止する
- テーブルの列マッピングを有効にする
- ジョブを再起動します(最初の再起動 - 列マッピングを初期化します)
- ジョブを再度再起動します (2 回目の再起動 - スキーマの変更を有効にします)
さらにスキーマを変更する場合 (列の追加または削除、列タイプの変更) も、ジョブを再起動する必要があります。
スキーマ追跡場所を指定する
次の例は、列マッピングを使用して Delta テーブルからのストリーミング読み取りにschemaTrackingLocationを指定する方法を示しています。
checkpoint_path = "/path/to/checkpointLocation"
(spark.readStream
.option("schemaTrackingLocation", checkpoint_path)
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpoint_path)
.toTable("output_table")
)