メインコンテンツまでスキップ

Databricksにおける削除ベクトル

削除ベクトルは、Delta Lake および Apache Iceberg テーブルでの DELETEUPDATE、および MERGE 操作を高速化します。削除ベクトルがない場合、単一の行を変更するには、そのレコードを含む Parquet ファイル全体を書き換える必要があります。代わりに、削除ベクトルはメタデータで変更済みとして行をマークし、読み取りはクエリ時に削除ベクトルのエントリを適用して現在のテーブルの状態を解決します。

注記

予測I/O更新では、Photonは削除ベクトルを使用してDELETEMERGE、およびUPDATEの操作を高速化します。予測 I/O を使用して更新を高速化するを参照してください。

前提条件

すべての Apache Iceberg v3 テーブルには、削除ベクトルがデフォルトで含まれています。Apache Iceberg v3 機能を使用を参照してください。Delta Lake テーブルでは、削除ベクトルを明示的に有効にする必要があります。

すべての最適化を適用して削除ベクトルを持つテーブルを書き込むには、Databricks Runtime 14.3 LTS 以降を使用してください。それらを読み取るには、Databricks Runtime 12.2 LTS 以降を使用してください。

Databricks Runtime 14.2 以降では、削除ベクトルを持つテーブルで行レベルのコンカレンシーがサポートされます。行レベルの同時実行性を参照してください。

クライアントの互換性

Databricks は、削除ベクトルを使用して、Photon対応コンピュートの更新のための予測I/Oを強化します。 予測 I/O を使用して更新を高速化するを参照してください。

削除ベクトルを用いた読み取りと書き込みのサポートは、クライアントによって異なります。

次の表は、削除ベクトルテーブルの読み取りと書き込みに必要なクライアントバージョンを示します。

クライアント

削除ベクトルを書き込みます

削除ベクトルを読み取る

Databricks Runtime (Photonを含む)

Databricks Runtime 12.2 LTS 以上を使用して、MERGEUPDATE、およびDELETEをサポートしています。

Databricks Runtime 12.2 LTS 以上が必要です。

Databricks Runtime(Photon なし)

Databricks Runtime 12.2 LTS 以上を使用する DELETE をサポートします。UPDATE は Databricks Runtime 14.1 以降でサポートされています。MERGEはDatabricks Runtime 14.3 LTS以降でサポートされています。

Databricks Runtime 12.2 LTS 以上が必要です。

OSS Apache Spark と OSS Delta Lake

OSS Delta 2.4.0以降を使用して、DELETEをサポートしています。OSS Delta 3.0.0 を使用して UPDATE をサポートしています以上。

OSS Delta 2.3.0 以上が必要です。

OpenSharingの受信者

OpenSharing テーブルでは、書き込みはサポートされていません。

Databricks には Databricks Runtime 14.1 以降が必要です。オープンソースの Apache Spark には delta-sharing-spark 3.1 以降が必要です。

他のクライアントのサポートについては、OSS Delta Lake インテグレーションのドキュメントを参照してください。

削除ベクトルを有効にする

ワークスペース設定では、SQLウェアハウスまたは Databricks Runtime 14.3 LTS 以降を使用する際に、新しいテーブルで削除ベクトルを有効にすることができます。デフォルト設定は地域によって異なります。削除ベクトルの自動有効化を参照してください。

Hive metastoreに格納されているマテリアライズドビューとストリーミングテーブルでは、削除ベクトルはデフォルトでは有効になっていません。

任意のテーブルまたはビューで削除ベクトルを手動で有効または削除するには、enableDeletionVectorsテーブルプロパティを使用します。

テーブルを作成または変更する際に、テーブルで削除ベクトルを有効にするには:

SQL
CREATE TABLE <table-name> [options] TBLPROPERTIES ('delta.enableDeletionVectors' = true);

ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.enableDeletionVectors' = true);

マテリアライズドビューまたはストリーミングテーブルで削除ベクトルを有効または削除するために、ALTER ステートメントを使用することはできません。CREATE TABLEステートメントを使用する必要があります。

警告

削除ベクトルを有効にすると、Databricks はテーブルプロトコルをアップグレードします。アップグレード後、削除ベクトルをサポートしていないクライアントは、テーブルを読み取ることができません。Delta Lake 機能の互換性とプロトコルを参照してください。

Databricks Runtime 14.1 以降では、削除ベクトル テーブル機能を削除して、他のクライアントとの互換性を有効にすることができます。Delta Lake テーブル機能の削除およびテーブルプロトコルのダウングレードを参照してください。

データファイルへのソフト削除の適用

削除ベクトルは、行への変更を、テーブル内の既存のParquetデータファイルを論理的に変更する論理的な削除としてマークします。Parquetデータファイルを物理的に書き換えるには、次のいずれかを実行します。

  • テーブルで OPTIMIZE を実行します。
  • テーブルで REORG TABLE ... APPLY (PURGE) を実行します。このコマンドは、削除ベクトルの変更を含むレコードを含むすべてのデータファイルを書き換えます。See REORG TABLE.
  • 自動圧縮を使用して書き込みを実行すると、削除ベクトルを含むデータファイルの再書き込みがトリガーされます。

ファイル圧縮イベントには、削除ベクトルに記録された変更を解決するための厳密な保証はありません。ターゲットデータファイルがファイル圧縮の対象ではない場合、削除ベクトルに記録された一部の変更は物理的に適用されない可能性があります。

古いデータを物理的に削除

パージ操作後も、変更されたデータがテーブルの古いデータファイル内に残る場合があります。データを物理的に削除する必要がある場合があります。例えば、クラウドプロバイダーでのストレージコストを削減したり、GDPRの要請に準拠したりするためです。

古いデータを物理的に削除するには:

  1. 実行 REORG TABLE ... APPLY (PURGE)
  2. 以前のテーブルバージョンからファイルを物理的に削除するために、パージ完了タイムスタンプに設定された保持しきい値でVACUUMを実行します。データ書き換えを強制するためにメタデータのみの削除をパージするを参照してください。

大規模なテーブルのパフォーマンスを向上させる

大規模なテーブルでのパージのパフォーマンスを向上させるには、spark.databricks.delta.reorg.purgeModerowsに設定します。

たとえば、REORG TABLE ... APPLY (PURGE)でデータを手動でパージする場合、またはALTER TABLE DROP FEATURE deletionVectorsで削除ベクトルを削除する場合に、この構成を設定します。

デフォルトでは、spark.databricks.delta.reorg.purgeModeall に設定されています。大規模なテーブルでは、パージ操作が削除された列データと論理削除された行の両方を確認するためにすべてのParquetファイルのフッターをスキャンする必要があるため、この操作は低速になる可能性があります。

rows の値は、論理的に削除された行を含むファイルのみを処理するように操作を制限します。大規模なテーブルでは、多くのファイルが論理削除された行を含まず、そのテーブルに削除された列がない場合、パフォーマンスが向上する可能性があります。

制限事項:

  • UniForm Iceberg v2 は削除ベクトルをサポートしていません。Apache Iceberg v3 は UniForm が有効なテーブルで削除ベクトルをサポートしています。Apache Iceberg v3 機能を使用を参照してください。

  • 削除ベクトルを使用するファイルを持つテーブルに対して、「GENERATEステートメント」を使用してマニフェストファイルを生成することはできません。マニフェストを生成するには、最初にREORG TABLE … APPLY (PURGE) ステートメントを実行し、その後、GENERATE ステートメントを実行します。REORG ステートメントを送信する際は、並列書き込み操作が実行されていないことを確認する必要があります。

    • 削除ベクトルが有効になっているテーブルに対して、マニフェストファイルをインクリメンタルに生成することはできません(たとえば、テーブル プロパティ delta.compatibility.symlinkFormatManifest.enabled=true を設定することによって)。
  • マテリアライズドビューまたはストリーミングテーブルで削除ベクトルを有効にし、その後、削除ベクトルを削除しても、削除ベクトルはビューまたはテーブルへの今後の書き込みには適用されません。ただし、既存の削除ベクトルは残ります。

  • マテリアライズドビューまたはストリーミングテーブルで削除ベクトルを有効にした後、その後削除ベクトルをオフにしても、テーブルプロトコルをダウングレードすることはできません。