テーブルに液体クラスタリングを使用する

液体クラスタリングは、テーブルのパーティション分割と ZORDERに代わるデータ レイアウト最適化手法です。 クラスタリング キーに基づいてデータを自動的に整理することで、テーブル管理が簡素化され、クエリのパフォーマンスが最適化されます。

従来のパーティション分割とは異なり、既存のデータを書き換えることなくクラスタリング キーを再定義できます。 これにより、変化する分析ニーズと共にデータ レイアウトを進化させることができます。 液体クラスタリングは、ストリーミング テーブルと具体化されたビューの両方に適用されます。

Important

Liquid クラスタリングは、Databricks Runtime 15.4 LTS 以降の Delta Lake テーブルと、Databricks Runtime 16.4 LTS 以降の Apache Iceberg テーブルのパブリック プレビューで一般提供されています。 Databricks では、最適なパフォーマンスを得るための最新の Databricks ランタイムを使用することをお勧めします。

マネージド Apache Iceberg v3 テーブルでは、削除ベクター、行追跡、行レベルのコンカレンシー、自動液体クラスタリングもサポートされています。 これらの機能には、Databricks Runtime 18.0 以降が必要です。 Apache Iceberg v3 機能の使用を参照してください。

液体クラスタリングを使用する場合

Databricks では、ストリーミング テーブルや具体化されたビューなど、すべての新しいテーブルに対して液体クラスタリングが推奨されます。 次のシナリオは、特にクラスタリングの利点があります。

  • カーディナリティの高い列をフィルター処理するクエリ。
  • データの偏りが大きいテーブル。
  • メンテナンスとチューニング作業を必要とする急速に成長するテーブル。
  • 同時書き込みの要件を持つテーブル。
  • さまざまなアクセス パターンまたは変更されたアクセス パターンを持つテーブル。
  • 典型的なパーティション キーを使用した場合、パーティション数が多すぎたり、少なすぎたりする結果が返される可能性があるテーブル。

リキッド クラスタリングを有効にする

既存のパーティション分割されていないテーブルまたはテーブルの作成時に、液体クラスタリングを有効にすることができます。 クラスタリングは、パーティション分割または ZORDERと互換性がありません。 Databricks では、テーブル内のデータのすべてのレイアウトと最適化操作をプラットフォームで管理できるようにすることをお勧めします。 液体クラスタリングを有効にした後、 OPTIMIZE ジョブを実行してデータを増分クラスター化します。 「クラスタリングをトリガーする方法」を参照してください。

クラスタリングを使用してテーブルを作成する

液体クラスタリングを有効にするには、次の例のように、テーブル作成ステートメントに CLUSTER BY フレーズを追加します。 Databricks Runtime 14.3 LTS 以降では、Python または Scala で DataFrame API と DeltaTable API を使用して、Delta Lake テーブルの液体クラスタリングを有効にすることができます。

SQL

クラスタリングを使用して空のテーブルを作成するには:

CREATE TABLE table1 (col0 INT, col1 STRING) CLUSTER BY (col0);

クラスタリングを使用して既存のデータからテーブルを作成するには、CLUSTER BYSELECT句ではなく、テーブル名の後に表示する必要があります。

CREATE TABLE table2 CLUSTER BY (col0)
AS SELECT * FROM table1;

クラスタリング構成を含むテーブル構造をコピーするには:

CREATE TABLE table3 LIKE table1;

Python

DeltaTable API を使用してクラスタリングを使用して空のテーブルを作成するには:

(DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute())

既存の DataFrame からテーブルを作成するには:

df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

DataFrameWriterV2 API を使用してテーブルを作成するには (Databricks Runtime 14.2 以降で使用できます)。

df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Scala

DeltaTable API を使用してクラスタリングを使用して空のテーブルを作成するには:

DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute()

既存の DataFrame からテーブルを作成するには:

val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

DataFrameWriterV2 API を使用してテーブルを作成するには (Databricks Runtime 14.2 以降で使用できます)。

val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Important

DataFrame API を使用してクラスタリング キーを設定する場合は、テーブルの作成時または overwrite モード ( CREATE OR REPLACE TABLE 操作など) の使用時にのみ、クラスタリング列を指定できます。 append モードを使用する場合、クラスタリング キーを変更することはできません。

データの追加中に既存のテーブルのクラスタリング キーを変更するには、SQL ALTER TABLE コマンドを使用して、データ書き込み操作とは別にクラスタリング構成を変更します。 クラスタリング・キーの変更を参照してください。

Databricks Runtime 16.4 LTS 以降では、次の例のように、構造化ストリーミング書き込みを使用して、液体クラスタリングが有効になっているテーブルを作成できます。

SQL

CREATE TABLE table1 (
  col0 STRING,
  col1 DATE,
  col2 BIGINT
)
CLUSTER BY (col0, col1);

Python

(spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")
)

Scala

spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")

Warning

液体クラスタリングが有効になっている Delta Lake テーブルでは、Delta ライター バージョン 7 とリーダー バージョン 3 が使用されます。 これらのプロトコルをサポートしていないデルタ クライアントは、これらのテーブルを読み取ることができません。 テーブル プロトコルのバージョンをダウングレードすることはできません。 Delta Lake の機能の互換性とプロトコルに関する記事を参照してください。

削除ベクトルなどの既定の機能有効化をオーバーライドするには、「既定の 機能有効化をオーバーライドする (省略可能)」を参照してください。

既存のテーブルで有効にする

既存のパーティション分割されていない Delta Lake テーブルで液体クラスタリングを有効にするには、次の操作を行います。

ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)

マネージド Apache Iceberg テーブルの場合は、次の点を考慮してください。

  • v2 仕様のテーブルの場合、既存のテーブルで液体クラスタリングを有効にする場合は、削除ベクトルと行追跡を明示的に無効にする必要があります。
  • v3 仕様のテーブルでは、削除ベクトルと行追跡がサポートされているため、これらの機能をオフにする必要はありません。 Apache Iceberg v3 機能の使用を参照してください。

Note

既定の動作では、以前に書き込まれたデータにクラスタリングは適用されません。 再クラスター化を強制するには、 OPTIMIZE <table_name> FULL または OPTIMIZE <table_name> FULL WHERE <predicate>を使用します。 「強制的に再クラスタリング」を参照してください。

パーティション テーブルを液体クラスタリングに変換する

Databricks Runtime 18.1 以降では、既存のパーティション分割された Delta Lake テーブルを液体クラスタリングに変換するには、REPLACE PARTITIONED BY WITH CLUSTER BY ステートメントでALTER TABLEを使用します。 変換により、リーダーとライターのダウンタイムが最小限に抑え、外部テーブルとマネージド テーブルの両方がサポートされます。 変換後、テーブルは Databricks Runtime 13.3 LTS 以降での読み取りをサポートします。

Note

管理された Iceberg テーブルの場合、これらのテーブルは液体クラスタリング キーとしてパーティション定義を使用するため、変換は必要ありません。 変換コマンドを実行すると、エラーが発生します。

パーティション テーブルを液体クラスタリングに変換する利点は次のとおりです。

  • データスキップ効率が低い、または過剰にパーティション分割されたテーブルのパフォーマンスを改善しました。
  • 頻繁に変化するクエリ パターンを持つテーブルに対して、 CLUSTER BY AUTOを使用した自動パフォーマンスの向上。
  • クラスタリング列は柔軟で簡単に変更できます。一方、パーティション分割は厳格で変更が困難です。
  • リキッド クラスタリングを使用するテーブルでは行レベルのコンカレンシーが可能になるため、書き込みの競合が減りました。 行レベルのコンカレンシーを参照してください。

Syntax

ALTER TABLE <table_name>
REPLACE PARTITIONED BY WITH CLUSTER BY [( <clustering_columns> ) | AUTO]

CLUSTER BY句では、次のオプションがサポートされています。

  • ( <clustering_columns> ): 新しいクラスタリング列を指定します。 Databricks では、新しいクラスタリング列を元のパーティション列と同様に保つことをお勧めします。 非常に異なる列を使用すると、最初の OPTIMIZE 実行で大規模な再クラスター化操作がトリガーされます。
  • AUTO: 現在のパーティション列を初期クラスタリング列として使用し、時間の経過に伴って予測最適化を適応させます。 Unity カタログのマネージド テーブルでのみ使用できます。 自動液体クラスタリングを参照してください。
  • オプションが指定されていない: 現在のパーティション列を新しいクラスタリング列として使用します。

パーティション テーブルから移行するときのクラスタリング キーの選択に関するガイダンスについては、パーティション 分割または Z オーダーからの移行を参照してください。

Examples

(year, month, day)でパーティション分割されたテーブルなど、元のパーティションとは異なる列にクラスター化するには、次の操作を行います。

ALTER TABLE t1 REPLACE PARTITIONED BY WITH CLUSTER BY (day, id);
OPTIMIZE t1;

Note

クラスタリング列を変更するメリットを得るために、 OPTIMIZEを実行する必要があります。

自動液体クラスタリングを使用し、現在のパーティション列から開始するには、次の操作を行います。

ALTER TABLE t2 REPLACE PARTITIONED BY WITH CLUSTER BY AUTO;

現在のパーティション列をクラスタリング列として保持するには、次の操作を行います。

ALTER TABLE t3 REPLACE PARTITIONED BY WITH CLUSTER BY;

変換中の同時読み取りと書き込みの処理

変換後、Databricks Runtime 13.3 LTS 以降は読み取りと書き込みがサポートされます。 Azure Databricksでは、変換中にテーブルに対して読み取りまたは書き込みを行うワークロードには、Databricks Runtime 15.4 LTS 以降をお勧めします。

変換中に同時読み取りと書き込みのワークロードを処理する方法については、次の表を参照してください。

ワークロードの種類 変換中の読み取り 変換中に書き込み
Batch ダウンタイムなし。 Databricks ランタイムのすべてのバージョンでは、変換中にテーブルを読み取ることができます。 Databricks Runtime 15.4 以降のダウンタイムはありません。
Databricks Runtime 15.3 以下の場合、Databricks では、変換前にワークロードを一時停止してから、変換が完了した後にワークロードを再起動することをお勧めします。
Streaming スキーマ追跡と列マッピングを使用: コミットを失わずにストリームを再起動します。
スキーマ追跡と列マッピングなし: ストリームによって例外が発生します。 新しいチェックポイントの場所で再起動し、バージョンを開始します。 コミットは失われません。
コミットを失わずにストリームを再起動します。

変換を確認またはロールバックする

変換を確認するには、 DESCRIBE EXTENDED 実行して新しいクラスタリング列を確認します。 DESCRIBE HISTORYを実行して、一連のREORG操作、UPGRADE PROTOCOL操作、およびREPLACE PARTITIONED BY WITH CLUSTER BY操作を確認します。

ロールバックはサポートされていません。 変更を元に戻すには、 CREATE TABLE AS SELECT (CTAS)文を使ってテーブルを再作成できます:

ALTER TABLE my_table UNSET TBLPROPERTIES ('delta.liquid.hierarchicalClusteringColumns');
ALTER TABLE my_table CLUSTER BY NONE;
CREATE OR REPLACE TABLE my_table PARTITIONED BY (<partition_columns>) AS SELECT * FROM my_table;

タイムスタンプ列でパーティション分割されたテーブルを変換する

タイムスタンプ列 (t1) でパーティション分割されたテーブル (timestamp_col) を変換し、タイムスタンプ列をクラスタリング キーとして使用するには、追加の構成を設定する必要があります。

SET spark.databricks.delta.liquidConversion.statsGeneration.enabled = false;
ALTER TABLE t1 REPLACE PARTITIONED BY WITH CLUSTER BY (timestamp_col, id);
ANALYZE TABLE t1 COMPUTE DELTA STATISTICS;

これらの構成なしでタイムスタンプ パーティション列をクラスタリング列に変換しようとすると、次のエラーが発生します。

ALTER TABLE REPLACE PARTITIONED BY WITH CLUSTER BY cannot auto-generate stats on table with column event_ts due to unsupported type: timestamp. Disable stats auto-generation by setting 'spark.databricks.delta.liquidConversion.statsGeneration.enabled' to 'false' and retry the command again. SQLSTATE: 42000

変換の制限事項

REPLACE PARTITIONED BY WITH CLUSTER BY変換コマンドには、次の制限事項が適用されます。

  • Lakeflow パイプラインで作成されたストリーミング テーブルと具体化されたビューはサポートされていません。 液体クラスタリングを使用するには、CLUSTER BYではなくPARTITIONED BYを使用するようにパイプライン定義を更新する必要があります。
  • Delta Sharing でパーティション フィルタリングを使用するテーブルはサポートされていません。 Delta Sharing のパーティション フィルタリングについては、共有するテーブル パーティションを指定するを参照してください。

クラスタリング キーを削除する

クラスタリング キーを削除するには、次の構文を使用します。

ALTER TABLE table_name CLUSTER BY NONE;

クラスタリング キーを選択する

クエリ フィルターで最もよく使用される列に基づいて、クラスタリング キーを選択します。 適切なキーを使用すると、データのスキップとクエリのパフォーマンスが大幅に向上します。

Tip

Databricks では、自動液体クラスタリングを使用して、クエリ パターンに基づいてクラスタリング キーをインテリジェントに選択することをお勧めします。 自動液体クラスタリングを参照してください。

キー選択のガイドライン

クラスタリング キーを手動で指定する場合は、クエリ フィルターで最もよく使用される列に基づいて列を選択します。 クラスタリング キーは任意の順序で定義できます。 2 つの列が高度に相関している場合は、そのうちの 1 つのみをクラスタリング キーとして含める必要があります。

最大 4 つのクラスタリング キーを指定できます。 小さいテーブル (10 TB 未満) では、クラスタリング キーを多く使用すると、1 つの列でフィルター処理するときにパフォーマンスが低下する可能性があります。 たとえば、4 つのキーを使用したフィルター処理は、2 つのキーを使用したフィルター処理よりもパフォーマンスが低下します。 ただし、テーブル サイズが大きくなると、このパフォーマンスの違いは単一列クエリではごくわずかになります。

クラスタリング キーは、統計が収集された列である必要があります。 既定では、Delta Lake テーブルは最初の 32 列の統計を収集します。 統計列の指定を参照してください。

サポートされているデータの種類

クラスタリングでは、クラスタリング キーに対して次のデータ型がサポートされています。

  • Date
  • Timestamp
  • TimestampNTZ (Databricks Runtime 14.3 LTS 以降)
  • String
  • Integer(整数)、Long(長整数)、Short(短整数)、Byte(バイト)
  • Float、Double、Decimal

StructFieldなどのドット表記を使用して、CLUSTER BY (struct_col.field)でクラスター化できます。 入れ子になった構造体フィールドは、 CLUSTER BY (struct_col.nested.field)などの任意の深さに対してサポートされます。 フィールドのデータ型は、前の一覧でサポートされている型のいずれかである必要があります。

次のいずれかによってクラスター化することはできません。

  • 複合型 ( StructTypeMapType、または ArrayType
  • MapTypeArrayType、または map_col['key'] などの array_col[0]map_col.key 要素

パーティション分割やZオーダーからの移行

Important

Databricks では、 REPLACE PARTITIONED BY WITH CLUSTER BY コマンドで自動変換を使用することをお勧めします。 「パーティション テーブルを液体クラスタリングに変換する」を参照してください。

既存のテーブルを変換する場合は、次の推奨事項を検討してください。

現在のデータ最適化手法 クラスタリング キーの推奨事項
Hive スタイルのパーティション分割 パーティション列をクラスタリング キーとして使用します。
Z オーダーのインデックス作成 ZORDER BY 列をクラスタリング キーとして使用します。
Hive スタイルのパーティション分割と Z オーダー パーティション列と ZORDER BY 列の両方をクラスタリング キーとして使用します。
カーディナリティを減らすために生成された列 (タイムスタンプの日付など) 元の列をクラスタリング キーとして使用し、生成された列を作成しないでください。

自動液体クラスタリング

Databricks Runtime 15.4 LTS 以降では、Unity カタログマネージド Delta Lake テーブルに対して自動液体クラスタリングを有効にすることができます。 Unity Catalog で管理される Apache Iceberg v3 テーブルの場合、自動液体クラスタリングには Databricks Runtime 18.0 以降が必要です。 自動液体クラスタリングを使用すると、Azure Databricks は、 CLUSTER BY AUTO 句を使用して、クエリのパフォーマンスを最適化するためにクラスタリング キーをインテリジェントに選択できます。

Note

自動液体クラスタリングは、Lakeflow パイプラインやスタンドアロン パイプラインを含む具体化されたビューとストリーミング テーブルでもサポートされます。 パイプラインまたは SQL 定義で CLUSTER BY AUTO を指定します。

自動液体クラスタリングのしくみ

自動液体クラスタリングでは、自動キー選択とクラスタリング操作の予測最適化が必要であり、非同期的に実行されます。 「Unity Catalog 管理テーブルの予測最適化」を参照してください。

自動液体クラスタリングは、使用パターンに基づいてインテリジェントな最適化を適用します。

  • クエリ ワークロードの分析: Azure Databricks は、テーブルの履歴クエリ ワークロードを分析し、クラスタリングに最適な候補列を識別します。
  • 変更に適応する: クエリ パターンまたはデータ分布が時間の経過と同時に変化する場合、自動液体クラスタリングによって新しいキーが選択され、パフォーマンスが最適化されます。
  • コストに対応した選択: Azure Databricks では、データスキップによるコスト削減の予測コストがデータ クラスタリング コストを上回る場合にのみ、クラスタリング キーが変更されます。

自動液体クラスタリングでは、次の理由によりキーが選択されない場合があります。

  • テーブルが小さすぎて、液体クラスタリングの恩恵を受け得ない。
  • テーブルには、以前の手動キーまたはクエリ パターンに一致する自然な挿入順序から有効なクラスタリング スキームが既に用意されています。
  • このテーブルには頻繁に実行されるクエリはありません。
  • Databricks Runtime 15.4 LTS 以降を使用していません。

Tip

なぜ予測最適化が特定のテーブルのクラスタリングキー選択をスキップしたのか知りたい場合は、カタログエクスプローラーの 履歴 タブを確認してください。 スキップ理由を見るには、操作列の「未適用」ラベルが付いたAUTO LIQUID行をクリックしてください。 カタログ エクスプローラーの「履歴使用」タブをご覧ください。

データとクエリの特性に関係なく、すべての Unity カタログマネージド テーブルに自動液体クラスタリングを適用できます。 ヒューリスティックは、クラスタリング キーを選択する方がコスト効果が高いかどうかを判断します。

Databricks Runtime バージョンの互換性

自動クラスタリングが有効になっているテーブルは、液体クラスタリングをサポートするすべての Databricks Runtime バージョンから読み取りまたは書き込みが可能です。 ただし、インテリジェント キーの選択は、Databricks Runtime 15.4 LTS で導入されたメタデータに依存します。

Databricks Runtime 15.4 LTS 以降を使用して、自動的に選択されたキーがすべてのワークロードに役立ち、新しいキーを選択するときにこれらのワークロードが考慮されるようにします。

自動液体クラスタリングを有効または無効にする

SQL

自動液体クラスタリングを使用してテーブルを作成するには:

CREATE OR REPLACE TABLE table1 (column01 int, column02 string) CLUSTER BY AUTO;

手動で指定したキーを持つテーブルを含め、既存のテーブルで自動液体クラスタリングを有効にするには:

ALTER TABLE table1 CLUSTER BY AUTO;

キー選択の初期クラスタリング列ヒントを設定するには、クラスタリング キーを設定してから、自動クラスタリングを有効にします。

ALTER TABLE table1 CLUSTER BY (c1, c2);
ALTER TABLE table1 CLUSTER BY AUTO;

または、Python API を使用して、1 つの操作でヒントを設定します。

自動液体クラスタリングをオフにするには:

ALTER TABLE table1 CLUSTER BY NONE;

自動液体クラスタリングをオフにし、クラスタリング列を指定するには:

ALTER TABLE table1 CLUSTER BY (column01, column02);

既存のテーブルで自動液体クラスタリングが有効になっている場合、CREATE OR REPLACE table_nameを使用せずにCLUSTER BY AUTOを実行すると、自動クラスタリングがオフになり、クラスタリング列は保持されません。 自動液体クラスタリングと以前に選択した列を保持するには、replace ステートメントに CLUSTER BY AUTO を含めます。 CLUSTER BY AUTOでは、予測最適化では、テーブルの履歴クエリ ワークロードを使用して、最適なクラスタリング キーを識別します。

Python

Python API は、Databricks Runtime 16.4 以降で使用できます。 Python は、テーブルを作成または置換する場合にのみ使用できます。 SQL を使用して、既存のテーブルの clusterByAuto 状態を変更します。

DataFrameWriterを使用して自動液体クラスタリングを使用してテーブルを作成するには:

df = spark.read.table("table1")
df.write
  .format("delta")
  .option("clusterByAuto", "true")
  .saveAsTable(...)

DataFrameWriterを使用してキー選択の初期クラスタリング列ヒントを設定するには:

df.write
  .format("delta")
  .clusterBy("clusteringColumn1", "clusteringColumn2")
  .option("clusterByAuto", "true")
  .saveAsTable(...)

DataFrameWriterV2を使用して自動液体クラスタリングを使用してテーブルを作成するには:

df.writeTo(...).using("delta")
  .option("clusterByAuto", "true")
  .create()

DataFrameWriterV2を使用してキー選択の初期クラスタリング列ヒントを設定するには:

df.writeTo(...).using("delta")
  .clusterBy("clusteringColumn1", "clusteringColumn2")
  .option("clusterByAuto", "true")
  .create()

自動液体クラスタリングを使用してストリーミング テーブルを作成するには:

spark.readStream.table("source_table")
  .writeStream
  .option("clusterByAuto", "true")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")

ストリーミング テーブルでキーを選択するための初期クラスタリング列ヒントを設定するには:

spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column1", "column2")
  .option("clusterByAuto", "true")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")

クラスター キーの選択ヒントに .clusterBy.option('clusterByAuto', 'true')と共に使用する場合の動作は次のとおりです。

  • これが初めて自動液体クラスタリングを設定する場合、クラスタリング列は .clusterByの指定された列に設定されます。
  • 自動液体クラスタリングが有効になっている既存のテーブルの場合、 .clusterBy ヒントは 1 回だけ受け入れられます。 たとえば、 .clusterBy で指定された列は、テーブルにクラスタリング列が設定されていない場合にのみ設定されます。

Important

DataFrame API を使用する場合、 clusterByAuto オプションは、 overwrite モードを使用する場合にのみ設定できます。 clusterByAuto モードを使用する場合、appendを設定することはできません。 この制限は、クラスタリング列を手動で設定する場合と同じです。 クラスタリング設定は、 overwrite モードを使用してテーブルの作成または置換操作中にのみ構成できます。

回避策として、データの追加中に既存のテーブルの clusterByAuto 状態を変更する場合は、SQL ALTER TABLE コマンドを使用して、データ書き込み操作とは別にクラスタリング構成を変更します。

自動クラスタリングが有効になっているかどうかを確認する

テーブルで自動液体クラスタリングが有効になっているかどうかを確認するには、 DESCRIBE TABLE または SHOW TBLPROPERTIESを使用します。

自動液体クラスタリングが有効になっている場合、 clusterByAuto プロパティは true に設定されます。 clusteringColumns プロパティには、自動的または手動で選択された現在のクラスタリング列が表示されます。

制限事項

マネージド Apache Iceberg v2 テーブルでは、自動液体クラスタリングを使用できません。 これは、Databricks Runtime 18.0 以降のマネージド Apache Iceberg v3 テーブルでサポートされています。

クラスター化されたテーブルにデータを書き込む

クラスター化された Delta Lake テーブルに書き込むには、液体クラスタリングで使用されるすべての Delta 書き込みプロトコル テーブル機能をサポートする Delta ライター クライアントを使用する必要があります。 クラスター化された Iceberg テーブルに書き込むには、Unity カタログの Iceberg REST Catalog API を使用できます。 Azure Databricksでは、Databricks Runtime 13.3 LTS 以降を使用する必要があります。

書き込み時のクラスタリングをサポートする操作

書き込み時にクラスター化される操作は次のとおりです。

  • INSERT INTO 操作
  • CTASRTAS のステートメント
  • Parquet 形式からの COPY INTO
  • spark.write.mode("append")

クラスタリングのサイズしきい値

書き込み時のクラスタリングがトリガーされるのは、トランザクション内のデータがサイズのしきい値を超えた場合だけです。 これらのしきい値はクラスタリング列の数によって異なり、Unity カタログのマネージド テーブルでは他の Delta Lake テーブルよりも低くなります。

クラスタリング列の数 Unity Catalog マネージド テーブルのしきい値サイズ その他の Delta Lake テーブルのしきい値サイズ
1 64MB 256 MB
2 256 MB 1 GB
3 512 MB 2 GB
4 1 GB 4GB

すべての操作にリキッド クラスタリングが適用されるわけではないため、Databricks では、すべてのデータが効率的にクラスター化されるように、OPTIMIZE を頻繁に実行することをお勧めします。

ストリーミング ワークロード

Spark 構成 spark.databricks.delta.liquid.eagerClustering.streaming.enabledtrue に設定すると、構造化ストリーミング ワークロードは書き込み時のクラスタリングをサポートします。 これらのワークロードのクラスタリングは、最後の 5 つのストリーミング更新のうち少なくとも 1 つが上記の表のサイズしきい値を超えた場合にのみトリガーされます。

クラスタリングをトリガーする方法

予測最適化では、有効なテーブルに対して OPTIMIZE コマンドが自動的に実行されます。 「Unity Catalog 管理テーブルの予測最適化」を参照してください。 予測最適化を使用する場合、Databricks では、スケジュールされた OPTIMIZE ジョブを無効にすることをお勧めします。

クラスタリングをトリガーするには、Databricks Runtime 13.3 LTS 以降を使用する必要があります。 Databricks では、大きなテーブルでの OPTIMIZE パフォーマンスを向上させるために、Databricks Runtime 17.3 LTS 以降をお勧めします。 テーブルで OPTIMIZE コマンドを使用します。

OPTIMIZE table_name;

液体クラスタリングは 増分的です。つまり、 OPTIMIZE は、クラスタリングが必要なデータに対応するために必要に応じてデータのみを書き換えます。 OPTIMIZE は、クラスター化されているデータと一致しないクラスタリング キーでデータ ファイルを書き換えません。 「強制的に再クラスタリング」を参照してください。

予測最適化を使用していない場合、Databricks では、クラスター データに対して通常の OPTIMIZE ジョブをスケジュールすることをお勧めします。 多数の更新または挿入が発生しているテーブルの場合、Databricks では、1 時間または 2 時間ごとに OPTIMIZE ジョブをスケジュールすることをお勧めしています。 リキッド クラスタリングは増分であるため、クラスター化されたテーブルのほとんどの OPTIMIZE ジョブは迅速に実行されます。

再クラスター化を強制する

Databricks Runtime 16.4 LTS 以降では、次の構文を使用して、テーブル内のすべてのレコードを強制的に再クラスター化できます。

OPTIMIZE table_name FULL;

Important

OPTIMIZE <table_name> FULL 実行すると、必要に応じて既存のすべてのデータが再クラスター化されます。 指定したキーでクラスター化されていない大きなテーブルの場合、この操作には数時間かかることがあります。

クラスタリングを初めて有効にしたとき、またはクラスタリング キーを変更するときに、OPTIMIZE <table_name> FULL を実行します。 以前に OPTIMIZE <table_name> FULL を実行していて、クラスタリング キーに変更がない場合、OPTIMIZE <table_name> FULLOPTIMIZEと同じように実行されます。 このシナリオでは、 OPTIMIZE は増分アプローチを使用し、以前に圧縮されていないファイルのみを書き換える。 データ レイアウトに現在のクラスタリング キーが反映されるようにするには、常に OPTIMIZE <table_name> FULL を使用します。

部分再クラスター

Databricks Runtime 18.1 以降では、 OPTIMIZE <table_name> FULL WHERE <predicate>を使用してレコードのサブセットの再クラスター化を強制できます。 ファイルは、その範囲の一部が述語と重複している場合に含まれます。 「パラメーター」を参照してください。

OPTIMIZE events FULL WHERE event_date >= '2025-01-01';

クラスター化されたテーブルからデータを読み取る

削除ベクトルの読み取りをサポートする任意の Delta Lake クライアントを使用して、クラスター化された Delta Lake テーブル内のデータを読み取ることができます。 Iceberg REST Catalog API を使用すると、クラスター化された Iceberg テーブル内のデータを読み取ることができます。 液体クラスタリングでは、クラスタリング キーでフィルター処理する際の自動データ スキップによってクエリのパフォーマンスが向上します。

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

クラスタリング キーの管理

テーブルのクラスター化方法を確認する

次の例のように、DESCRIBE コマンドを使用して、テーブルのクラスタリング キーを確認できます。

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

クラスタリング キーを変更する

テーブルのクラスタリング キーは、次の例のように、ALTER TABLE コマンドを実行することでいつでも変更できます。

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

クラスタリング キーを変更すると、後続の OPTIMIZE 操作と書き込み操作では新しいクラスタリング アプローチが使用されますが、既存のデータは書き換えられません。 更新されたクラスタリング キーを使用して既存のデータを書き換える方法については、「 再クラスター化の強制」を参照してください。

次の例のように、キーを NONE に設定してクラスタリングを無効にすることもできます。

ALTER TABLE table_name CLUSTER BY NONE;

クラスター キーを NONE に設定しても、クラスター化されたデータは書き換わりませんが、将来の OPTIMIZE 操作でクラスタリング キーが使用されるのを防ぐことができます。

外部エンジンから液体クラスタリングを使用する

外部 Iceberg エンジンから管理された Iceberg テーブルで液体クラスタリングを有効にすることができます。 液体クラスタリングを有効にするには、テーブルの作成時にパーティション列を指定します。 Unity カタログでは、パーティションがクラスタリング キーとして解釈されます。 たとえば、OSS Spark で次のコマンドを実行します。

CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY c1;

液体クラスタリングをオフにするには:

ALTER TABLE main.schema.icebergTable DROP PARTITION FIELD c2;

Iceberg パーティションの進化を使用してクラスタリング キーを変更するには:

ALTER TABLE main.schema.icebergTable ADD PARTITION FIELD c2;

バケット変換を使用してパーティションを指定すると、Unity Catalog は式を削除し、その列をクラスタリング キーとして使用します。

CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY (bucket(c1, 10));

リキッド クラスタリングありのテーブルの互換性

Liquid クラスタリングでは、読み取りと書き込みに特定の Databricks ランタイム バージョンを必要とする Delta Lake テーブル機能が使用されます。 Databricks Runtime 14.3 LTS 以降で液体クラスタリングを使用して作成されたテーブルでは、既定でチェックポイント V2 が使用されます。 Databricks Runtime 13.3 LTS 以降では、チェックポイント V2 を使用してテーブルの読み取りと書き込みを行うことができます。 チェックポイント V2 を参照してください。

Databricks Runtime 12.2 LTS を 13.2 に使用するリーダーをサポートするには、チェックポイント V2 を無効にし、テーブル プロトコルをダウングレードします。 「 クラシックにダウングレードする」を参照してください。

既定の機能の有効化をオーバーライドする (省略可能)

液体クラスタリングの有効化中に、既定の Delta Lake テーブル機能の有効化をオーバーライドできます。 これにより、これらのテーブル機能に関連付けられているリーダー プロトコルとライター プロトコルのアップグレードが防止されます。 次の手順を実行するには、既存のテーブルが必要です。

  1. ALTER TABLEを使用して、1 つ以上のフィーチャをオフにするテーブル プロパティを設定します。 たとえば、削除ベクターをオフにするには、次のコマンドを実行します。

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. 次を実行して、テーブルでリキッド クラスタリングを有効にします。

    ALTER TABLE <table_name>
    CLUSTER BY (<clustering_columns>)
    

次の表に、オーバーライドできる Delta 機能と、有効化が Databricks Runtime バージョンとの互換性にどのように影響するかを示します。

デルタ機能 ランタイムの互換性 有効化をオーバーライドするプロパティ オフにした場合の液体クラスタリングへの影響
ベクトルの削除 読み取りと書き込みには、Databricks Runtime 12.2 LTS 以降が必要です。 'delta.enableDeletionVectors' = false 削除ベクトルをオフにすると、行レベルのコンカレンシーもオフになり、トランザクションとクラスタリング操作が競合する可能性が高くなります。 行レベルのコンカレンシーを参照してください。
DELETEMERGE、および UPDATE コマンドの実行速度が低下する場合があります。
行の追跡 書き込みには、Databricks Runtime 13.3 LTS 以降が必要です。 任意の Databricks Runtime バージョンから読み取ることができます。 'delta.enableRowTracking' = false 行の追跡を無効にすると、行レベルのコンカレンシーも無効になり、トランザクションとクラスタリング操作が競合する可能性が高くなります。 行レベルのコンカレンシーを参照してください。
チェックポイント V2 読み取りと書き込みには、Databricks Runtime 13.3 LTS 以降が必要です。 'delta.checkpointPolicy' = 'classic' 液体クラスタリングの動作には影響しません。 チェックポイント V2 を参照してください。

制限事項

  • Databricks Runtime 15.1 以下: 書き込み時のクラスタリングでは、フィルター、結合、集計を含むソース クエリはサポートされていません。
  • Databricks Runtime 15.4 LTS 以下: 構造化ストリーミング書き込みを使用して、液体クラスタリングが有効になっているテーブルを作成することはできません。 構造化ストリーミングを使用して、リキッド クラスタリングが有効になっている既存のテーブルにデータを書き込むことはできます。
  • Apache Iceberg v2: 削除ベクターと行追跡はサポートされていないため、管理された Apache Iceberg v2 テーブルでは行レベルのコンカレンシーはサポートされていません。
    • v3 仕様では削除ベクトルと行追跡がサポートされているため、マネージド Apache Iceberg v3 テーブルでは行レベルのコンカレンシーがサポートされます。 Apache Iceberg v3 機能の使用を参照してください。