次の方法で共有


Delta Lake 列マッピングを使用して列の名前を変更および削除する

このページでは、Delta Lake 列マッピングを使用して、メタデータのみの変更で、データ ファイルを書き換えずに列を削除または名前変更済みとしてマークする方法について説明します。

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

前提条件と制限事項

列マッピングを有効にする前に、次の制限事項を理解してください。

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

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

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

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

  • リーダー バージョン 2 以降
  • ライター バージョン 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')

Warnung

列マッピングを削除すると、物理列名を論理名に置き換えるために、すべてのデータ ファイルが書き換えられます。 この操作では、行レベルまたは物理的な競合解決はサポートされていません。

同時書き込み操作では、 ConcurrentModificationExceptionが発生します。 列マッピングを削除する前に:

  1. ストリーミング ジョブや ETL パイプラインなど、すべての同時書き込み操作を一時停止します。
  2. テーブルの 予測最適化 を無効にします。
  3. 大きなテーブルの場合は、アクティビティの少ない期間中にこの操作をスケジュールします。

テーブル プロトコルのダウングレードをサポートする別の方法については、「 列マッピングを無効にする」を参照してください。

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

Databricks Runtime 15.3 以降では、 DROP FEATURE コマンドを使用して列マッピングを削除し、テーブル プロトコルをダウングレードできます。 古いリーダーとの互換性のためにプロトコル バージョンをダウングレードする必要がある場合は、 列マッピングを削除 する代わりに、この方法を使用します。

重要

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

Delta Lake テーブル機能の削除とテーブル プロトコルのダウングレードに関する記事を参照してください。

列マッピングとストリーミング

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

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

実行中のジョブで列マッピングを有効にする

重要

実行中のストリーミング ジョブで列マッピングを有効にするには:

  1. ジョブを停止する
  2. テーブルで列マッピングを有効にする
  3. ジョブを再起動します (最初の再起動 - 列マッピングを初期化します)
  4. ジョブをもう一度再起動する (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")
)

次のステップ