Azure Databricks では Delta Lake テーブルの列マッピングがサポートされています。これにより、メタデータのみの変更で、データ ファイルを書き換えずに列を削除または名前変更済みとしてマークできます。 また、ユーザーは、スペースなどの Parquet で許可されていない文字を使用して Delta テーブルの列に名前を付けることもできます。これにより、ユーザーは以前の文字制約のために列の名前を変更しなくても、CSV または JSON データを Delta に直接取り込むことができます。
重要
列マッピングが有効になっているテーブルは、Databricks Runtime 10.4 LTS 以降でのみ読み取ることができます。
差分テーブルの読み取りにディレクトリ名に依存するレガシ パターンを使用する場合、列マッピングを有効にすると、従来のワークロードが中断される可能性があります。 列マッピングが有効になっているパーティション テーブルでは、パーティション ディレクトリの列名の代わりにランダム なプレフィックスが使用されます。 「Delta Lake と Parquet ではパーティション分割戦略が共有されますか?」を参照してください。
テーブルで列マッピングを有効にすると、差分変更データ フィードに依存するダウンストリーム操作が中断される可能性があります。 列マッピングが有効になっているテーブルのデータ フィード制限の変更を参照してください。
テーブルで列マッピングを有効にすると、ソースとしての Delta テーブルからのストリーミング読み取りが中断される可能性があります (Lakeflow 宣言パイプラインを含む)。 「列マッピングとスキーマの変更が伴うストリーミング」を参照してください。
列マッピングを有効にする
列マッピングを有効にするには、次のコマンドを使用します。
ALTER TABLE <table-name> SET TBLPROPERTIES (
'delta.columnMapping.mode' = 'name'
)
列マッピングには、次のデルタ プロトコルが必要です。
- Reader バージョン 2 以降。
- Writer バージョン 5 以降。
Delta Lake の機能の互換性とプロトコルに関する記事を参照してください。
列マッピングを無効にする
Databricks Runtime 15.3 以降では、DROP FEATURE
コマンドを使用してテーブルから列マッピングを削除し、テーブル プロトコルをダウングレードできます。
重要
テーブルから列マッピングを削除しても、パーティション テーブルのディレクトリ名で使用されるランダムなプレフィックスは削除されません。
Delta Lake テーブル機能の削除とテーブル プロトコルのダウングレードに関する記事を参照してください。
列の名前を変更する
注
Databricks Runtime 10.4 LTS 以降で使用できます。
Delta テーブルに対して列マッピングが有効になっている場合は、列の名前を変更できます。
ALTER TABLE <table-name> RENAME COLUMN old_col_name TO new_col_name
その他の例については、「Delta Lake テーブル スキーマの更新」を参照してください。
列を削除する
注
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 Lake テーブル スキーマの更新」を参照してください。
列名でサポートされている文字
Delta テーブルに対して列マッピングが有効になっている場合は、テーブルの列名にスペースとこれらの文字のいずれかを含めることができます: ,;{}()\n\t=
。
列マッピングとスキーマの変更が伴うストリーミング
スキーマ追跡の場所を指定して、列マッピングが有効になっている Delta テーブルからのストリーミングを有効にすることができます。 これにより、非加法スキーマの変更によってストリームが破損する可能性がある問題が解決されます。
データ ソースに対する各ストリーミングの読み取りには、独自の schemaTrackingLocation
を指定する必要があります。 指定した schemaTrackingLocation
は、ストリーミング書き込み用のターゲット テーブルの checkpointLocation
に指定されたディレクトリ内に含まれている必要があります。 複数のソース Delta テーブルのデータを結合するストリーミング ワークロードの場合は、ソース テーブルごとに checkpointLocation
内の一意のディレクトリを指定する必要があります。
重要
現在実行中のジョブで列マッピングを有効にするには、ジョブを少なくとも 2 回停止して再起動する必要があります (つまり、2 回再起動します)。
- 最初の再起動では、列マッピングが初期化されます。
- 2 回目の再起動では、スキーマの変更を有効にします。
さらにスキーマが変更された場合 (列の追加や削除、列の種類の変更など)、ジョブを再起動する必要もあります。
次のコード例に示すように、schemaTrackingLocation
オプションを使用してスキーマ追跡のパスを指定します。
checkpoint_path = "/path/to/checkpointLocation"
(spark.readStream
.option("schemaTrackingLocation", checkpoint_path)
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpoint_path)
.toTable("output_table")
)