Delta Lakeのテーブルが大規模になると、クエリがスキャンするデータ量の制御が パフォーマンスの決定要因になります。従来はパーティショニングやZ-ORDERでデータレイアウトを最適化していましたが、 パーティションキーの変更にはテーブルの再作成が必要で、 Z-ORDERは毎回テーブル全体を再ソートするコストがありました。
Liquid ClusteringはDBR 13.3 LTS(2023年後半GA)で導入された Delta Lakeの次世代データレイアウト最適化機能です。 パーティション不要・クラスタリングキーの動的変更・増分再クラスタリングの3つの特長により、 従来手法の制約を根本的に解消します。
Liquid Clusteringが従来手法と根本的に異なるのは、以下の3点です。
Liquid Clusteringの設定は CLUSTER BY 句で行います。 テーブル作成時に指定する方法と、既存テーブルに後から設定する方法があります。
-- 新規テーブルをLiquid Clusteringで作成
CREATE TABLE catalog.schema.sales (
sale_id BIGINT,
customer_id BIGINT,
region STRING,
sale_date DATE,
amount DECIMAL(18,2)
)
CLUSTER BY (region, sale_date);
-- CTASでLiquid Clusteringテーブルを作成
CREATE TABLE catalog.schema.sales_optimized
CLUSTER BY (customer_id, sale_date)
AS SELECT * FROM catalog.schema.raw_sales;-- クラスタリングキーを変更(メタデータ更新のみ、即時完了)
ALTER TABLE catalog.schema.sales
CLUSTER BY (customer_id, region);
-- クラスタリングを無効化
ALTER TABLE catalog.schema.sales
CLUSTER BY NONE;CLUSTER BY NONE でクラスタリングを無効化できます。 無効化しても既存データのレイアウトは維持されますが、 以降のOPTIMIZEではクラスタリングが行われなくなります。
3つのデータレイアウト最適化手法の特性を比較します。 Liquid Clusteringは両方の利点を取り込みつつ、欠点を解消した手法です。
| 比較項目 | パーティショニング | Z-ORDER | Liquid Clustering |
|---|---|---|---|
| カーディナリティ | 低カーディナリティ推奨(数十〜数百)。高カーディナリティだとSmall Files問題発生 | 制約なし | 制約なし |
| キー変更 | テーブル再作成が必要(ディレクトリ構造の変更) | OPTIMIZE実行時に指定を変更可能だが全データ再ソート | ALTER TABLE一文で即座に変更(メタデータ更新のみ) |
| 増分最適化 | パーティション単位で可能 | 不可(毎回テーブル全体をソート) | 未クラスタリングデータのみ処理 |
| OPTIMIZE必要性 | ファイル統合(Compaction)目的のみ | 必須(OPTIMIZE ZORDER BYで実行) | 必須だが増分処理のため高速 |
| データスキッピング | パーティションプルーニング(ディレクトリ単位) | ファイルレベルのmin/max統計 | Hilbert Curveによる高精度なファイルレベルスキッピング |
| 推奨シナリオ | レガシーテーブル、低カーディナリティの日付・リージョン | 既存テーブルの後付け最適化(Liquid Clustering非対応環境) | 新規テーブル全般、キー変更の可能性があるテーブル、高カーディナリティフィルタ |
Databricksは新規テーブルではLiquid Clusteringの使用を公式に推奨しており、パーティショニングやZ-ORDERは既存テーブルの互換性維持のために残されています。
Liquid Clusteringの内部では、Hilbert Curve(ヒルベルト曲線) というSpace-Filling Curve(空間充填曲線)を使って多次元データを1次元に射影しています。 Z-ORDERが使用するZ-curve(Morton曲線)と比較して、 Hilbert Curveは空間的に隣接するデータポイントが1次元上でもより近くに配置される特性があり、 データスキッピングの精度が向上します。
┌──────────────────────────────────────────────────────┐
│ Z-Curve (Morton曲線) Hilbert Curve │
│ │
│ 0 ─ 1 4 ─ 5 0 ─ 1 14─ 15 │
│ │ │ │ │ │ │ │ │ │
│ 3 ─ 2 7 ─ 6 3 ─ 2 13─ 12 │
│ │ │ │
│ 12─ 13 8 ─ 9 4 ─ 5 10─ 11 │
│ │ │ │ │ │ │ │ │ │
│ 15─ 14 11─ 10 7 ─ 6 9 ─ 8 │
│ │
│ → 空間的に近いデータが → 空間的に近いデータが │
│ 1次元で離れるケースあり 常に1次元でも近接 │
└──────────────────────────────────────────────────────┘
Hilbert Curveの利点:
- 空間的局所性がZ-Curveより高い
- WHERE region = 'APAC' AND sale_date = '2026-03-01'
のような多次元フィルタでスキッピング精度が向上
- 統計情報(min/max)の範囲が狭くなり、
不要ファイルの除外率が高まるLiquid Clusteringは各データファイルに「クラスタリング済み」か 「未クラスタリング」かのメタデータを付与します。 OPTIMIZEを実行すると、未クラスタリングのファイル(新規INSERT・UPDATE・MERGEで追加されたファイル) だけがクラスタリング処理の対象となります。
-- 増分再クラスタリングの流れ
-- Step 1: テーブル作成
CREATE TABLE events CLUSTER BY (user_id, event_date) ...;
-- Step 2: データ追加(未クラスタリング状態でファイルが追加)
INSERT INTO events SELECT * FROM raw_events;
-- → 新規ファイルは is_clustered = false
-- Step 3: OPTIMIZE実行
OPTIMIZE events;
-- → is_clustered = false のファイルだけを読み込み
-- → Hilbert Curveで再配置し、新しいファイルとして書き出し
-- → 新ファイルは is_clustered = true
-- → 古いファイルはトランザクションログで無効化
-- Step 4: 追加データのみ再クラスタリング
INSERT INTO events SELECT * FROM new_events;
OPTIMIZE events;
-- → Step 4のINSERTで追加されたファイルだけが対象
-- → Step 3でクラスタリング済みのファイルは処理しないLiquid Clusteringが設定されたテーブルでは、OPTIMIZEコマンドの動作が通常のDelta Tableと異なります。
| 動作 | 通常のDelta Table | Liquid Clusteringテーブル |
|---|---|---|
| OPTIMIZE | Small Filesの統合(Compaction)のみ | Compaction+Hilbert Curveによる再クラスタリング |
| OPTIMIZE ... ZORDER BY | Z-ORDERでデータを再配置 | エラー(CLUSTER BYと併用不可) |
| 処理対象 | テーブル全体(Z-ORDER時) | 未クラスタリングファイルのみ(増分) |
-- Liquid Clusteringテーブルでの正しいOPTIMIZE
OPTIMIZE catalog.schema.sales;
-- → 未クラスタリングデータだけを増分処理
-- エラーになる例
OPTIMIZE catalog.schema.sales ZORDER BY (region);
-- → Error: CLUSTER BYが設定されたテーブルにZORDER BYは使用できませんDatabricksのPredictive Optimization(予測的最適化)が有効な場合、 Unity Catalogのマネージドテーブルに対してOPTIMIZEが自動的にスケジュールされます。 Liquid Clusteringテーブルでは、この自動OPTIMIZEで増分再クラスタリングも同時に実行されます。 手動でOPTIMIZEを実行する必要がなくなるため、運用負荷が大幅に軽減されます。
-- Predictive Optimizationの有効化(Unity Catalogスキーマ単位)
ALTER SCHEMA catalog.schema
SET DBPROPERTIES ('delta.enablePredictiveOptimization' = 'true');
-- テーブル単位での設定
ALTER TABLE catalog.schema.sales
SET TBLPROPERTIES ('delta.enablePredictiveOptimization' = 'true');
-- 有効な場合のLiquid Clusteringテーブルの運用:
-- 1. OPTIMIZE が自動スケジュールされる
-- 2. 増分再クラスタリングが自動実行される
-- 3. VACUUMも自動スケジュールされる
-- → 手動でのメンテナンスコマンド実行が不要にパーティションテーブルやZ-ORDERテーブルからLiquid Clusteringへの移行手順は、テーブルの種類によって異なります。
-- Step 1: Liquid Clusteringを有効化
ALTER TABLE catalog.schema.events
CLUSTER BY (user_id, event_date);
-- Step 2: 増分再クラスタリング実行
OPTIMIZE catalog.schema.events;
-- これ以降、OPTIMIZE ZORDER BY は不要(使用するとエラー)
-- 以降のOPTIMIZEで自動的にHilbert Curveベースのクラスタリングが実行パーティションテーブルにはLiquid Clusteringを直接設定できません。CTAS(CREATE TABLE AS SELECT)またはDEEP CLONEで新テーブルを作成する必要があります。
-- 方法A: CTAS で新テーブル作成
CREATE TABLE catalog.schema.events_v2
CLUSTER BY (region, event_date)
AS SELECT * FROM catalog.schema.events_partitioned;
-- 方法B: DEEP CLONE + ALTER TABLE
CREATE TABLE catalog.schema.events_v2
DEEP CLONE catalog.schema.events_partitioned;
ALTER TABLE catalog.schema.events_v2
CLUSTER BY (region, event_date);
OPTIMIZE catalog.schema.events_v2;
-- 移行後の検証
SELECT COUNT(*) FROM catalog.schema.events_v2;
DESCRIBE DETAIL catalog.schema.events_v2;
-- clusteringColumns に [region, event_date] が表示されることを確認-- 分析パターンの変化に応じてキーを変更
-- Before: region と sale_date でフィルタが多かった
-- After: customer_id と product_category でフィルタが増えた
ALTER TABLE catalog.schema.sales
CLUSTER BY (customer_id, product_category);
-- 次回のOPTIMIZEで新キーによる増分再クラスタリングが開始
OPTIMIZE catalog.schema.sales;Liquid ClusteringはData Engineer Associate(DEA)とSpark Developer試験で出題される重要トピックです。特にZ-ORDERとの違いが頻出で、「どちらを選ぶべきか」の判断が問われます。
Data Engineer Associate
問題 1
あるチームは、Delta Lakeテーブル events に対して毎日 OPTIMIZE ... ZORDER BY (user_id) を実行しています。テーブルサイズが10TBを超え、OPTIMIZEの実行時間が8時間以上かかるようになりました。クエリパターンは user_id と event_date でのフィルタが大半です。OPTIMIZEの実行時間を短縮しつつ、クエリのデータスキッピング効果を維持または向上させる最適な方法はどれですか?
正解: B
Liquid Clustering(CLUSTER BY)に移行することで、OPTIMIZEは未クラスタリングデータだけを増分処理するようになり、毎回10TB全体を再ソートするZ-ORDERと比較して処理時間が劇的に短縮されます。Hilbert Curveベースのデータ配置により、user_idとevent_dateの多次元フィルタに対するスキッピング精度もZ-ORDERと同等以上です。選択肢Aはカラム数を減らしてもZ-ORDERの全データ再ソートという根本的な問題は解消しません。選択肢Cはevent_dateのカーディナリティが高い場合にSmall Files問題が発生し、テーブル再作成のコストも大きいです。選択肢Dはファイルサイズの調整では処理量自体は削減されず、根本的な解決にはなりません。
Liquid ClusteringとZ-ORDERは同じテーブルに併用できますか?
できません。Liquid Clustering(CLUSTER BY)が設定されたテーブルに対してOPTIMIZE ... ZORDER BYを実行するとエラーになります。Liquid ClusteringはZ-ORDERの上位互換として設計されており、Hilbert Curveベースの多次元データ配置とファイルレベルのデータスキッピングを統合しています。既存テーブルでZ-ORDERを使用している場合は、ALTER TABLE ... CLUSTER BY (col1, col2) でLiquid Clusteringに移行し、以降はOPTIMIZE(ZORDER BY指定なし)で増分再クラスタリングが実行されます。
Liquid Clusteringのキーを変更すると既存データはどうなりますか?
ALTER TABLE ... CLUSTER BY (new_col) でクラスタリングキーを変更しても、既存データは即座には再クラスタリングされません。次回のOPTIMIZE実行時に、未クラスタリングのデータ(新しいキーで整列されていないデータ)が増分的に再クラスタリングされます。キー変更はメタデータの更新のみで、テーブルの書き換えは発生しません。これがパーティショニングとの最大の違いで、パーティショニングでは物理的なディレクトリ構造の変更が必要なため、キー変更には全データの書き換えが必要です。
Liquid Clusteringを使うにはPhoton Engineが必須ですか?
必須ではありませんが、強く推奨されます。Liquid ClusteringのOPTIMIZE処理はPhoton上で最も効率的に実行されるよう設計されており、特に大規模テーブルではPhotonなしの場合と比較して2〜5倍の性能差が出ることがあります。DBR 13.3 LTS以降が必要で、Serverless SQL WarehouseやPhoton対応クラスターでの利用が推奨です。Photonが利用できない環境でもLiquid Clusteringは動作しますが、OPTIMIZE処理の所要時間が長くなる可能性があります。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Databricks資格一覧|全7試験・難易度・勉強法
Databricks認定資格全7試験の一覧・難易度・出題範囲・合格ラインを徹底解説。2026年最新版の公式試験ガイドに準...
Databricks試験の難易度ランキング|全7資格を徹底比較
Databricks認定全7試験の難易度をランキング形式で徹底比較。合格率・学習時間・出題傾向から難易度を分析。...
Databricks資格の勉強方法|最短合格ルートと学習時間の目安
Databricks認定資格に最短で合格するための勉強方法を完全ガイド。公式リソース・問題集・学習スケジュールを徹底解説...
Databricks Data Engineer Associate完全解説|出題範囲・問題例・合格戦略
Databricks Certified Data Engineer Associate試験を徹底解説。5つの出題ドメイ...
Databricks Data Engineer Professional完全解説|上級試験の攻略法
Databricks Certified Data Engineer Professional試験を徹底解説。10の出題...