液態叢集是一種靈活的 Microsoft Fabric 中 Delta 資料表資料佈局策略。 它以宣告式、變更友善的叢集取代靜態 Hive 風格的分割與手動 Z 順序維護。 你可以定義要叢集的欄位,Fabric Spark 執行時會自動處理實體資料配置。
利用本文:
- 了解液體聚類的運作方式以及何時使用。
- 比較液體聚類與分割及 Z 階。
- 在你的資料表上設定叢集功能。
- 了解增量液體聚類(Runtime 2.0+)。
- 調整叢集行為與會話配置。
什麼是液體聚集?
液態聚類將資料組織在 Delta 表格檔案中,使得分群欄中值相近的列會被共置。 此版面設計允許在查詢執行時強化 檔案跳過 :當查詢篩選分群欄位時,引擎只讀取值範圍與謂詞相符的檔案,其餘檔案會跳過。
與分割不同,液體聚類:
- 它不會為每欄值建立實體目錄結構。
- 它不需要你在建立表格時選擇分群欄位(之後可以更改)。
- 可處理高基數資料行,且無需建立數千個微小分割區,因此可避免潛在的小檔案問題。
- 在
OPTIMIZE期間套用版面配置最佳化,而非在寫入時。
相較於分割與 Z 順序的優點
液態聚類在靈活性、維護及處理不斷演變的資料模式方面,相較於蜂巢式分割與 Z-Order 具有顯著優勢。
與 Hive 式分區相比
| 層面 | Hive 格式分割 | 液體叢集 |
|---|---|---|
| 粒度 | 每個相異的值(或值的組合)對應一個目錄 | 檔案層級的值範圍,無目錄 |
| 高基數 | 建立數千個小型檔案/目錄 | 手感自然;將資料分成合適大小的檔案 |
| 列數變動 | 需要完整重寫表格 |
ALTER TABLE ... CLUSTER BY 在下一個 OPTIMIZE 套用 |
| 寫入路徑 | 分割欄位必須在寫入時已知 | 任何欄位都可以事後聚類 |
| 小檔案問題 | 這在串流或頻繁插入時很常見 | 以 OPTIMIZE 壓縮管理 |
與 Z-Order 相比
| 層面 | Z序列 | 液體叢集 |
|---|---|---|
| 列數變動 | 必須使用新欄位重新執行 OPTIMIZE ZORDER BY (...) |
ALTER TABLE ... CLUSTER BY 持續維持定義 |
| 增量支援 | 無增量模式;使用 WHERE 手動限制範圍 |
增量模式(Runtime 2.0+)僅自動處理新檔案、變更檔案或不良檔案 |
| Metadata | 無持久欄位定義 | 將欄位分群存放於表格元資料中 |
| 多欄佈局 | 在最佳化時套用的 Z 順序曲線 | 一個聚類欄位的 Z 階;2+ 欄的希爾伯特曲線,提供最佳化的資料區域性 |
液態分群在單欄佈局中使用 Z-Order,在 2 欄以上的佈局中則使用希爾伯特曲線,這比僅將 Z-Order 曲線用於多維分群的 Z-Order 有所改進。 液態聚類將兩種演算法包裹在一個增量式、具元資料感知的框架中,降低持續維護成本。
建立一個液態叢集表
在資料表建立時使用 CLUSTER BY 子句定義分群欄位:
-- Create a new clustered table
CREATE TABLE dbo.sales (
order_id BIGINT,
order_date DATE,
region STRING,
amount DECIMAL(10,2)
) CLUSTER BY (order_date, region);
-- Create from query results
CREATE TABLE dbo.sales_clustered
CLUSTER BY (order_date, region)
AS SELECT * FROM raw_sales;
-- Enable on existing table
ALTER TABLE dbo.sales_txn CLUSTER BY (order_date, region);
變更分群欄位
與分割不同,你可以隨時更改分群欄位,無需重寫資料:
-- Change clustering columns
ALTER TABLE sales CLUSTER BY (region, product_category);
-- Remove clustering (table becomes unclustered)
ALTER TABLE sales CLUSTER BY NONE;
在更改分群欄位後,新的版面配置會套用到下一次 OPTIMIZE 執行。 現有檔案會保留先前的版面配置,直到重新叢集。
用 OPTIMIZE 套用叢集
叢集會在指令執行 OPTIMIZE 時應用。 語句中不需要指定欄位, OPTIMIZE 因為叢集定義是儲存在資料表的元資料中:
-- Cluster the table using the defined clustering columns
OPTIMIZE sales;
-- Recluster partial Z-Cubes and Z-Cubes with different clustering keys or clustering providers
OPTIMIZE sales FULL;
當你更改群集鍵並想重建不符合現有聚類策略的 Z-Cube 時,請使用 OPTIMIZE FULL 。
Z-Cube 是液體聚類用來分組共享相同分群欄位的檔案的邏輯單元。 資料會被集中在單一的 Z-Cube 中,直到叢集鍵數改變或資料量超過 100 GB。
Tip
自 Fabric Runtime 2.0 起,
液體聚類的運作原理
當你在液態叢集表上執行 OPTIMIZE 時,會發生以下情況:
-
檔案選擇:引擎會選擇需要叢集的檔案。
- 在 Runtime 2.0+(增量分群策略)中,僅會選取尚未分群、狀態不佳、較小,或含有刪除向量的檔案。
- 在 Runtime 1.3 中,每個 Z-Cube 小於 100 GB 的所有檔案都會被選取,不論它們是否已經很好地叢集。
- Bin 打包:選取的檔案會依據最佳輸出檔案大小分組。
- 重新分區:每個分箱中的資料都會使用空間填充曲線重新分區(多欄使用希爾伯特曲線,單欄使用 Z 順序曲線)。
- 檔案寫入:重新分割的資料會以新檔案的形式寫入,並在叢集欄位中設定嚴格的值範圍。
- 元資料更新:Delta 日誌記錄檔案替換,並以叢集元資料標記新檔案。
結果是叢集欄位的值範圍不重疊(或重疊極少),使引擎能跳過不匹配查詢謂詞的檔案。
Caution
Fabric Runtime 1.3(Delta 3.2):使用液體叢集時請謹慎。 在此執行時,液態叢集使用完整的 Z-Cube 重寫策略——每個 Z-Cube 內的檔案在每次執行時都會重寫。 只有當 Z-Cube 的大小超過 100 GB 時,才會被保留(跳過)。 對於小於 100 GB 的資料表,完整重寫意味著每次 OPTIMIZE 執行都會重寫所有資料表資料,即使資料已經很好地叢集。 這會導致嚴重的寫入放大。
- 在執行時 1.3 中,不要使用帶有液體聚類的自動壓縮。 每個自動壓實觸發條件都可能導致重寫整個資料表,而不只是對新增或變更的資料進行分群整理。
- 避免每次寫入操作後都執行
OPTIMIZE。 在 Runtime 1.3 中,將分群限制為基於策略、刻意安排的執行作業,並接受在這些執行作業之間分群結果的即時性較低。
漸進液體叢集(消除寫入放大)僅在 Fabric Runtime 2.0 開始提供。
增量液體聚類
從 Fabric Runtime 2.0(Delta 4.1)開始,液態叢集預設採用 增量 叢集策略。 增量策略相較於標準群集行為有顯著改進。
Important
增量液體叢集僅在 Fabric Runtime 2.0 及以後版本中提供。 在早期執行環境中,會 OPTIMIZE 採用標準的(完全重寫)行為,即每次執行時都重寫 Z-Cube 內的所有檔案。
為什麼增量聚類策略很重要
標準的群集演算法會在每次執行時重寫 Z-Cube(最多 100 GB)OPTIMIZE檔案,不論它們是否已經很好地群聚。 對於接收小附加資料的資料表,叢集成本會隨資料表大小線性增加,而非隨新資料量增加。
增量模式透過只選擇真正需要叢集的檔案來解決完全重寫的問題:
- 非叢集檔案:新寫入的資料但未進行叢集元資料
- 小型檔案:低於目標檔案大小門檻的檔案
- 帶有刪除向量的檔案:累積刪除次數超過清理閾值的檔案
已經叢集良好且大小適中的檔案會被完全跳過。
自動重新叢集
增量液體聚類包含自動重疊偵測,稱為 自動重新聚類,以維持聚類品質隨時間推移。 隨著新資料的到來,可能會造成檔案值範圍的重疊,降低資料跳過的效能。 自動重新聚類會偵測檔案間的重疊值範圍,並選擇性地只重新聚類受影響的檔案。
只要有新的或已變更的資料需要進行叢集,自動重新叢集就會作為 OPTIMIZE 的一部分自動執行。 無需人工介入,也不需要排程的完整重新分群。 增量分群策略能隨著資料演變維持近乎最佳的分群品質。
還原為完整重寫行為
如果你需要停用增量叢集策略並使用完全重寫行為,請設定以下設定:
SET spark.microsoft.delta.optimize.clustering.strategy.incremental = FALSE;
OPTIMIZE sales;
或者,也可以使用 OPTIMIZE FULL 一次性完整重新叢集,且不更改會話設定:
OPTIMIZE sales FULL;
Note
增量聚類策略故意允許與理論最佳佈局略有偏差,以大幅降低寫入放大效果。 執行 OPTIMIZE FULL 可藉由將 Z-Cube 完全重建至理論最佳狀態來消除這個差距,但寫入成本也較高。
設定參考
以下會話配置控制 Fabric Runtime 2.0+ 中的液體叢集行為。
增量分群
| 設定 | 類型 | Default | Description |
|---|---|---|---|
spark.microsoft.delta.optimize.clustering.strategy.incremental |
布林值 | true |
主交換器用於增量叢集。 當 true 時,OPTIMIZE 僅處理未叢集化、不健康、小型及含刪除向量的檔案。 當 false時,所有大小低於 100 GB 的 Z 立方體檔案都會被重寫(標準行為)。 |
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster |
布林值 | true |
能自動偵測並重新分群資料範圍重疊的檔案。 只有啟用增量叢集時才適用。 |
自動重新叢集調校
這些配置控制自動重新聚類的靈敏度與範圍。 預設值適用於大多數工作負載。 只有在需要在叢集品質和寫入放大之間做出權衡時,才會調整它們。
| 設定 | 類型 | Default | Description |
|---|---|---|---|
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOffendingFiles |
Int | 4 |
觸發重新分群所需的最少重疊檔案數量。 較低的數值會較早重新叢集(查詢效能較佳,寫入成本較高)。 應該是≥2。 |
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOverlapThreshold |
Double | 0.75 |
分群維度重疊分數閾值。 得分高於此值的檔案對被視為重疊。 必須在 (0.25, 1.0) 範圍內。 數值越低越積極。 |
選擇群集欄位
為了獲得最佳結果,請根據你最常見的查詢篩選模式選擇分群欄位:
-
從中挑選1到4欄 ,這些欄位經常出現在
WHERE子句中。 欄位越多,空間填充曲線對每個欄位的檔案略過效果就越差,且資料分群所需的時間也會增加。 - 考慮欄基數。 低基數欄位會產生較少的不同值範圍,因此與高基數分群鍵結合時,會降低檔案略過的效益。
-
欄序對聚類沒有影響。 後
CLUSTER BY述列的順序不會影響所產生的多維聚類。
支援的資料行類型
並非所有欄位類型都能用作分群鍵。 引擎會評估每個欄位的資料類型以判斷資格。
始終符合資格(原子類型):
-
NumericType(ByteType,ShortType,IntegerType,LongType,FloatType,DoubleType, )DecimalType DateTypeTimestampTypeTimestampNTZTypeStringType
有條件資格:
Note
以下類型可從 Fabric Spark Runtime 2.0(Delta 4.1)開始啟用
-
StructType:啟用spark.microsoft.delta.clusteredTable.complexTypes.enabled時,且所有葉節點欄位本身都屬於符合條件的類型。 -
ArrayType:當spark.microsoft.delta.clusteredTable.complexTypes.enabled已啟用,且元素類型符合條件時。 -
MapType: 當spark.microsoft.delta.clusteredTable.complexTypes.enabled啟用時,且鍵型與值類型皆可排序且符合資格。
不符合資格:
BinaryTypeBooleanTypeNullType
如需瞭解檔案層級統計中使用的對應符合資格資料型別,請參閱 檔案略過—符合資格的資料型別。
與其他特徵的互動
| Feature | 行為 |
|---|---|
| Partitioning | 不相容。 就檔案略過效果而言,建議採用液態叢集技術,而非分區。 |
| Z-Order | 不相容。 就檔案跳過而言,建議採用 Liquid Clustering,而非 Z-Order。 |
| 快速優化 | 從執行環境 2.0 開始相容。 在早期執行環境中,快速優化對液態叢集資料表沒有影響。 在 OPTIMIZE 期間,若小型檔案數量不足,或資料量不足以產生大小適當的輸出檔案,則會略過分群作業。 |
| 自適應目標檔案大小 | 相容。 透過自適應評估設定的目標檔案大小作為叢集的目標大小。 |
| 優化寫入 | 相容。 在寫入時產生整併檔案,然後在 OPTIMIZE 期間進行叢集整理。 |
| 自動壓縮 | 在 Runtime 1.3 或更早版本中,請勿使用液體叢集。 在這些執行環境中,每次觸發自動壓縮時,都會重寫所有位於小於 100 GB 的 Z-Cubes 中的資料,導致嚴重的寫入放大。 在 Runtime 2.0+ 中,支援自動壓縮:增量式分群可確保只會重寫新檔案或狀況不佳的檔案。 自動壓實負責小檔案整併;OPTIMIZE 負責叢集配置。 |
| 刪除向量 | 超過刪除列門檻的檔案會被選中進行叢集,與其叢集狀態無關。 |
| V 順序 | 相容。 V-Order 與液態分群作用於不同的面向(檔案內部配置與跨檔案的值範圍)。 兩者可以同時應用。 |
最佳做法
- 在批次寫入後或串流資料表時可定期執行
OPTIMIZE——但僅限於 Runtime 2.0+,因為增量叢集策略使頻繁執行成本降低。 在執行時 1.3 及更早版本中,每次OPTIMIZE執行都會重寫 100 GB 以下所有 Z-Cube 的資料,因此執行應該是有意識且不頻繁的。 -
請節制使用
OPTIMIZE FULL。 保留它,等你更換分群欄位或需要一次性重置品質時再用。 - 透過在 Spark UI 或查詢計畫中檢查查詢掃描指標(掃描檔案與總檔案比例)來監控叢集品質。
- 針對串流工作負載,結合最佳化寫入,以確保每個微批次產生可控的檔案數量,從而利於分群。