針對數據表使用液體叢集

液體聚類是一種資料佈局最佳化技術,它取代了表分割和 ZORDER。 它簡化了表管理,並透過根據叢集鍵自動組織資料來優化查詢效能。

與傳統分割不同,您可以重新定義叢集索引鍵,而無需重寫現有資料。 這可讓您的資料版面配置隨著分析需求的變化而發展。 液體叢集同時適用於串流資料表和具體化檢視。

這很重要

液態叢集通常適用於 Databricks Runtime 15.4 LTS 及以上版本的 Delta Lake 資料表,以及 Databricks Runtime 16.4 LTS 及以上版本的 Apache Iceberg 資料表公開預覽版。 Databricks 建議使用最新的 Databricks Runtime 以獲得最佳效能。

受管理的 Apache Iceberg v3 表格也支援刪除向量、列追蹤、列層級並行及自動液體叢集。 這些功能需要 Databricks Runtime 18.0 及以上版本。 請參閱 使用 Apache Iceberg v3 功能

何時使用液態聚類

Databricks 建議針對所有新資料表使用流動叢集,包括串流資料表和具體化檢視。 下列案例特別受益於叢集:

  • 在高基數欄位上進行篩選的查詢。
  • 資料嚴重偏斜的表格。
  • 快速增長的資料表需要維護和調整優化。
  • 具有並行寫入需求的資料表。
  • 存取模式多變或變動的表格。
  • 典型分割鍵可能返回的資料表,是因為分割區過多或過少。

啟用液體群集

您可以在現有未分割的資料表上或在建立資料表期間啟用液體叢集。 叢集與分割或ZORDER不相容。 Databricks 建議允許平臺管理資料表中資料的所有版面配置和最佳化作業。 啟用液體叢集之後,請執行 OPTIMIZE 工作以累加叢集資料。 請參閱 如何觸發叢集

使用叢集建立資料表

若要啟用液體群集,請將 CLUSTER BY 字串新增至資料表創建語句,如下列範例所示。 在 Databricks Runtime 14.3 LTS 及以上版本中,你可以使用 DataFrame API 和 Python 或 Scala 的 DeltaTable API 來啟用 Delta Lake 表格的液態叢集功能。

SQL

若要建立含叢集的空白資料表:

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

若要從現有資料建立具有叢集功能的資料表,必須 CLUSTER BY 出現在資料表名稱之後,而非以下 SELECT 子句:

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())

要從現有的資料框架建立資料表:

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()

要從現有的資料框架建立資料表:

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()

這很重要

使用 DataFrame API 設定叢集索引鍵時,只能在建立表格時指定叢集列,或是在使用 overwrite 模式(例如進行 CREATE OR REPLACE TABLE 操作)時設定。 使用 append 模式時,您無法變更叢集索引鍵。

若要在附加資料時變更現有資料表上的叢集索引鍵,請使用 SQL ALTER TABLE 命令將叢集組態與資料寫入作業分開修改。 請參見 變更分群鍵

在 Databricks Runtime 16.4 LTS 及更新版本中,你可以透過 Structured Streaming 寫入來建立已啟用 liquid clustering 的資料表,如以下範例所示:

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")

警告

已啟用液態分群的 Delta Lake 資料表使用 Delta 寫入器版本 7 和讀取器版本 3。 不支援這些協議的 Delta 客戶端無法讀取這些資料表。 你不能降級桌面協定版本。 請參閱 Delta Lake 功能相容性和通訊協定

若要覆寫預設功能啟用設定(例如刪除向量),請參閱 覆寫預設功能啟用設定(選用)

在現有資料表上啟用

要在現有未分割的 Delta Lake 表格上啟用液態叢集,請執行以下操作:

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

對於受管理的 Apache Iceberg 表格,請考慮以下幾點:

  • 對於採用 v2 規格的資料表,在現有資料表上啟用液態叢集時,您必須明確關閉刪除向量和資料列追蹤。
  • 對於採用 v3 規格的資料表,關閉這些功能並非必要,因為已支援刪除向量和列追蹤。 請參閱 使用 Apache Iceberg v3 功能

注意

默認行為不會將叢集套用至先前寫入的數據。 若要強制重新聚類,請使用 OPTIMIZE FULLOPTIMIZE FULL WHERE <predicate>。 參見 「力再聚」

將分割資料表轉換為液態叢集

在 Databricks Runtime 18.1 及更新版本中,若要將現有的分區 Delta Lake 資料表轉換為液態叢集,請在 REPLACE PARTITIONED BY WITH CLUSTER BY 陳述式中使用 ALTER TABLE。 轉換可將讀取與寫入作業的停機時間降至最低,並支援外部資料表和受管理資料表。 轉換後,該表格支援 Databricks Runtime 13.3 LTS 及以上版本的讀取。

注意

對於受管理的 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 Catalog 管理的資料表。 請參閱 自動液體群集
  • 未指定選項:使用目前的分割欄位作為新的分群欄位。

關於從分割資料表遷移時選擇分群鍵的指引,請參見「 從分割遷移」或「Z-order」。

Examples

若要依與原始分割區不同的欄位進行叢集,例如針對以 (year, month, day) 分割的資料表,請執行下列步驟:

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

注意

要從修改群集欄位中受益,你必須執行 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 作業。

若要回滾轉換,請使用 RESTORE 還原至上一個版本。 或者,你也可以用 REPLACE TABLE ... PARTITIONED BY (...) AS SELECT * FROM ...重新寫出表格。

若要使用 RESTORE 進行回復,請執行下列指令:

ALTER TABLE my_table CLUSTER BY NONE;
ALTER TABLE my_table UNSET TBLPROPERTIES ('delta.liquid.hierarchicalClusteringColumns');
RESTORE TABLE my_table TO VERSION AS OF <version_number_before_conversion>;

參見 RESTORE

轉換以時間戳記欄位劃分的資料表

若要轉換一個以時間戳記欄位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 pipelines 中建立的串流表格和實體化視圖。 要使用液態叢集,您必須更新管線定義,改用 CLUSTER BY 而非 PARTITIONED BY
  • 使用 Delta Sharing 搭配分割區篩選的資料表不受支援。 關於三角洲共享的分割區過濾資訊,請參見 「指定共享的表格分割區」。

移除叢集索引鍵

若要移除叢集索引鍵,請使用下列語法:

ALTER TABLE table_name CLUSTER BY NONE;

選擇叢集金鑰

根據查詢篩選中最常用的欄位選擇分群鍵。 正確的鍵能大幅提升資料跳過率與查詢效能。

小提示

Databricks 建議使用自動液體叢集,根據查詢模式智慧地選擇群組鍵。 請參閱 自動液體群集

關鍵選擇指南

當您手動指定叢集索引鍵時,請根據查詢篩選器中最常使用的欄來選擇相應的欄位。 您可以依任何順序定義叢集索引鍵。 如果兩個數據行高度相互關聯,您只需要將其中一個數據行當做叢集索引鍵來包含。

您最多可以指定 四個叢集索引鍵。 對於較小的資料表(少於 10 TB),使用更多叢集鍵在單一欄位過濾時可能會降低效能。 例如,使用四個索引鍵進行篩選的效能比使用兩個索引鍵進行篩選的效能更差。 不過,隨著資料表大小的增加,對於單欄查詢來說,這種效能差異可以忽略不計。

叢集鍵必須是已收集統計資料的欄位。 預設情況下,Delta Lake 表格會收集前 32 欄的統計數據。 請參閱 「指定統計欄位」。

支援的數據類型

叢集支援叢集索引鍵的下列資料類型:

  • Date
  • 時間戳記
  • TimestampNTZ (Databricks Runtime 14.3 LTS 和更新版本)
  • String
  • 整數、長整數、短整數、位元組
  • 浮點、雙精度、十進制

你可以使用點記法依據 StructField 進行分群,例如 CLUSTER BY (struct_col.field)。 巢狀結構欄位可支援任意深度,例如 CLUSTER BY (struct_col.nested.field)。 欄位的資料型別必須是前述列表中支援的類型之一。

你無法依下列任一項進行分群:

  • 複型,例如 StructTypeMapTypeArrayType
  • MapType 以及 ArrayType 元素,如 map_col['key']array_col[0]map_col.key

從分區或 Z 序遷移

這很重要

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 子句,以智慧方式選擇叢集索引鍵,從而優化查詢效能。

注意

自動液體叢集也支援實體化視圖與串流資料表,包括 Lakeflow 管線與獨立管線。 在你的管線或 SQL 定義中指定 CLUSTER BY AUTO

自動液體叢集的工作原理

自動液態叢集需要預測優化以實現自動鍵選擇與叢集操作,且以非同步方式執行。 請參閱 Unity Catalog 管理資料表的預測性優化

自動液體聚類會根據您的使用模式進行智慧優化:

  • 分析查詢工作負載:Azure Databricks 會分析資料表的歷史查詢工作負載,並識別叢集的最佳候選資料行。
  • 適應變化:如果您的查詢模式或資料分佈隨時間變化,自動液體叢集會選擇新鍵來優化效能。
  • 成本感知選擇:只有在預測由資料跳過帶來的節省成本超過資料聚類成本時,Azure Databricks 才會更改分群鍵。

自動液體聚類可能不會選取索引鍵,原因可能包括以下幾點:

  • 表格太小,無法利用液體群集的優勢。
  • 表格已具有有效的叢集配置,無論是來自先前的手動索引鍵,還是符合查詢模式的自然插入順序。
  • 這個資料表的查詢不頻繁。
  • 你並沒有使用 Databricks 的 Runtime 15.4 LTS 或更高版本。

不論數據和查詢特性為何,您都可以為所有 Unity 目錄受控數據表套用自動液體叢集。 啟發式會決定選取叢集索引鍵是否具有成本效益。

Databricks 執行時版本相容性

您可以從支援液體叢集的所有 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 在單一操作中設定提示。

要關閉自動液體聚類:

ALTER TABLE table1 CLUSTER BY NONE;

要關閉自動液體聚類並指定聚類欄位:

ALTER TABLE table1 CLUSTER BY (column01, column02);

如果現有資料表已啟用自動液態叢集,執行 CREATE OR REPLACE table_name 而不執行 CLUSTER BY AUTO 會停用自動叢集,且不會保留叢集資料行。 為了保留自動液體聚類及先前選取的欄位,請在替換語句中包含 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指定的欄位。
  • 如果這是已啟用自動 Liquid 分群的現有資料表,則 .clusterBy hint 只會被接受一次。 例如,只有在資料表未設定叢集欄位時,才會設定由 .clusterBy 指定的欄位。

這很重要

使用 DataFrame API 時,選項clusterByAuto只能在使用overwrite模式時設定。 使用clusterByAuto模式時無法設定append。 此限制與手動設定分群欄位相同。 你只能在建立資料表或替換操作時,使用 overwrite 模式來設定叢集設定。

因應措施是,如果您想要在附加資料時變更 clusterByAuto 現有資料表的狀態,請使用 SQL ALTER TABLE 命令將叢集組態與資料寫入作業分開修改。

檢查是否已啟用自動叢集

若要檢查資料表是否已啟用自動液體群集,請使用 DESCRIBE TABLESHOW TBLPROPERTIES

如果已啟用自動液體群集,屬性 clusterByAuto 會設定為 true。 屬性 clusteringColumns 會顯示自動或手動選取的目前叢集數據行。

Limitations

受管理的 Apache Iceberg v2 表格無法提供自動液體叢集功能。 它支援 Databricks Runtime 18.0 及以上版本的受管型 Apache Iceberg v3 資料表。

將數據寫入叢集數據表

要寫入叢集的 Delta Lake 資料表,必須使用支援液態叢集所用所有 Delta 寫入協定功能的 Delta 寫入客戶端。 若要寫入叢集的 Iceberg 資料表,您可以使用 Unity 目錄的 Iceberg REST 目錄 API。 在 Azure Databricks 上,你必須使用 Databricks Runtime 13.3 LTS 及以上版本。

支援寫入叢集的作業

寫入時叢集的操作包括以下各項:

  • INSERT INTO 運作
  • CTASRTAS 語句
  • COPY INTO 來自於 Parquet 格式
  • spark.write.mode("append")

叢集的大小臨界值

只有當交易中的數據達到大小閾值時,才會在寫入操作中啟動叢集。 這些閾值會依據聚類欄位數量而異,且 Unity 目錄管理的資料表比其他 Delta Lake 資料表低。

叢集資料欄的數目 Unity Catalog 管理表格的臨界大小 其他 Delta Lake 資料表的大小閾值
1 64 MB 256 MB
2 256 MB 1 GB
3 512 MB 2 GB
4 1 GB 4 GB

因為並非所有作業都套用液體叢集,因此 Databricks 建議經常執行 OPTIMIZE ,以確保所有數據都能有效率地叢集化。

串流工作負載

結構化串流工作負載在您將 Spark 配置 spark.databricks.delta.liquid.eagerClustering.streaming.enabled 設定為 true 時支援在寫入時進行叢集處理。 如果過去五次串流更新中至少有一次超過上表的大小閾值,這些工作負載的叢集才會觸發。

如何觸發叢集

預測優化會自動對已啟用的資料表執行命令 OPTIMIZE。 請參閱 Unity Catalog 管理資料表的預測性優化。 使用預測性優化時,Databricks 建議停用任何排程 OPTIMIZE 的工作。

若要觸發叢集,您必須使用 Databricks Runtime 13.3 LTS 或更新版本。 Databricks 建議使用 Databricks Runtime 17.3 LTS 及以上版本,以提升 OPTIMIZE 大型資料表的效能。 在資料表中使用 OPTIMIZE 命令:

OPTIMIZE table_name;

液體叢集是 增量的,這表示 OPTIMIZE 只會視需要重寫資料,以容納需要叢集的資料。 OPTIMIZE 不會重寫與被叢集資料不符的群組鍵碼資料檔案。 參見 「力再聚」

如果您未使用預測最佳化,Databricks 建議排程定期的 OPTIMIZE 作業來將資料分群。 對於進行很多更新或插入的數據表,Databricks 建議每隔一兩小時排程一次 OPTIMIZE 作業。 因為液體叢集是累加式的,因此叢集數據表的大部分 OPTIMIZE 作業都會快速執行。

強制重新聚集

在 Databricks Runtime 16.4 LTS 及以上版本中,你可以強制將表格中的所有記錄重新叢集,語法如下:

OPTIMIZE table_name FULL;

這很重要

執行 OPTIMIZE FULL 視需要將所有現有的數據重新叢集。 對於先前未在指定索引鍵上叢集的大型數據表,此作業可能需要數小時的時間。

第一次啟用叢集或變更叢集金鑰時,請執行 OPTIMIZE FULL。 如果您先前已執行 OPTIMIZE FULL 且叢集金鑰沒有變更,OPTIMIZE FULL 執行與 OPTIMIZE相同。 在此案例中, OPTIMIZE 會使用累加方法,並只重寫先前尚未壓縮的檔案。 請一律使用 OPTIMIZE FULL,以確保數據配置反映目前的叢集索引鍵。

部分再聚

在 Databricks Runtime 18.1 及以上版本中,你可以使用 OPTIMIZE FULL WHERE <predicate>. 強制對部分記錄進行重新叢集。 若檔案的範圍中有任何部分與謂詞重疊,則該檔案即被包含。 請參閱 參數

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

從叢集數據表讀取數據

你可以使用任何支援讀取刪除向量的 Delta Lake 用戶端,讀取叢集 Delta Lake 資料表中的資料。 使用 Iceberg REST 目錄 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 引擎啟用 Liquid Clustering。 若要啟用液態群集,請在建立數據表時指定分割欄。 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 叢集使用 Delta Lake 資料表功能,這些功能需要特定的 Databricks 執行時版本來讀寫。 在 Databricks Runtime 14.3 LTS 及以上版本中,使用液態叢集建立的資料表預設使用 checkpoint V2。 你可以在 Databricks Runtime 13.3 LTS 及以上版本使用 checkpoint V2 讀寫資料表。 詳見 檢查點V2

為了支援使用 Databricks Runtime 12.2 LTS 到 13.2 的用戶,請停用檢查點 V2 並降級資料表協定。 請參考 降級至經典版。

覆寫預設功能啟用(可選)

你可以在啟用液態叢集時,覆寫 Delta Lake 資料表功能啟用的預設設定。 這可防止與這些表格功能相關的讀寫協定升級。 您必須有現有的資料表,才能完成下列步驟:

  1. ALTER TABLE 來設定關閉一個或多個功能的表格屬性。 例如,要關閉刪除向量,執行以下操作:

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. 執行下列命令,在資料表上啟用液體叢集:

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

下表列出可覆寫的 Delta 功能,以及啟用如何影響與 Databricks 執行版本的相容性:

Delta 功能 執行階段相容性 覆蓋啟用狀態的屬性 關閉後對液體聚集的影響
刪除向量 讀取和寫入需要 Databricks Runtime 12.2 LTS 和更新版本。 'delta.enableDeletionVectors' = false 關閉刪除向量也會關閉列層級的並行,使交易與叢集操作更容易衝突。 參見 列層級並行
DELETEMERGEUPDATE 命令的執行速度可能會變慢。
列追蹤 寫入操作需要 Databricks Runtime 13.3 LTS 或更高版本。 可以從任何 Databricks Runtime 版本進行讀取。 'delta.enableRowTracking' = false 關閉列追蹤也會關閉列層級的並行,使交易與叢集操作更容易衝突。 參見 列層級並行
檢查點V2 讀取和寫入需要 Databricks Runtime 13.3 LTS 和更新版本。 'delta.checkpointPolicy' = 'classic' 對液體聚集行為沒有影響。 詳見 檢查點V2

Limitations

  • Databricks 執行環境 15.1 及以下版本:寫入時叢集不支援包含過濾器、連接或聚合的原始碼查詢。
  • Databricks 執行環境 15.4 LTS 及以下版本:您無法使用結構化串流寫入建立啟用了 liquid clustering 的表。 您可以使用結構化串流將資料寫入已啟用液體叢集的現有資料表。
  • Apache Iceberg v2:管理式 Apache Iceberg v2 資料表不支援列級並行,因為不支援刪除向量和列追蹤。
    • 在受管理的 Apache Iceberg v3 表格中支援列層級並行,因為 v3 規範支援刪除向量與列追蹤。 請參閱 使用 Apache Iceberg v3 功能