共用方式為


使用差異數據表的液體叢集

Delta Lake liquid 叢集會取代數據表分割,並 ZORDER 簡化數據配置決策,並將查詢效能優化。 液態叢集可讓您彈性地重新定義叢集索引鍵,而不需要重寫現有的資料,讓資料配置隨著時間的分析需求演進。

重要

Databricks 建議針對已啟用液體叢集的所有數據表使用 Databricks Runtime 15.2 和更新版本。 Databricks Runtime 13.3 LTS 和更新版本提供具有限制的公開預覽支援。

注意

已啟用液體叢集的數據表支援 Databricks Runtime 13.3 LTS 和更新版本中的數據列層級並行。 Databricks Runtime 14.2 和更新版本通常會針對已啟用刪除向量的所有數據表,提供數據列層級並行存取。 請參閱 Azure Databricks 上的隔離等級和寫入衝突

什麼是液體群集?

Databricks 建議針對所有新的 Delta 數據表進行液體群集。 以下是受益於叢集的案例範例:

  • 資料表通常會依高基數資料行篩選。
  • 資料分佈中有明顯扭曲的資料表。
  • 快速成長且需要維護和微調的資料表。
  • 具有並行寫入需求的資料表。
  • 具有隨時間變更之存取模式的資料表。
  • 一般分割區索引鍵可能會讓資料表留下太多或太少的資料分割區。

啟用液體群集

您可以在現有資料表或資料表建立期間啟用液體叢集。 叢集與數據分割或 ZORDER不相容,而且您必須使用 Azure Databricks 來管理數據表中數據的所有配置和優化作業。 啟用液體叢集之後,請像往常一樣執行 OPTIMIZE 作業,以累加方式叢集數據。 請參閱 如何觸發叢集

若要啟用液體叢集,請將詞組新增 CLUSTER BY 至數據表建立語句,如下列範例所示:

注意

在 Databricks Runtime 14.2 和更新版本中,您可以使用 Python 或 Scala 中的 DataFrame API 和 DeltaTable API 來啟用液體叢集。

SQL

-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) CLUSTER BY (col0);

-- Using a CTAS statement
CREATE EXTERNAL TABLE table2 CLUSTER BY (col0)  -- specify clustering after table name, not in subquery
LOCATION 'table_location'
AS SELECT * FROM table1;

-- Using a LIKE statement to copy configurations
CREATE TABLE table3 LIKE table1;

Python

# Create an empty table
(DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute())

# Using a CTAS statement
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

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

Scala

// Create an empty table
DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute()

// Using a CTAS statement
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

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

警告

使用已啟用液體叢集建立的數據表,在建立和使用 Delta 寫入器第 7 版和讀取器第 3 版時,已啟用許多 Delta 數據表功能。 您可以覆寫這些功能的啟用。 請參閱 覆寫預設功能開啟 (選擇性)

數據表通訊協定版本無法降級,且已啟用叢集的數據表無法由不支援所有已啟用 Delta 讀取器通訊協定數據表功能的 Delta Lake 用戶端讀取。 請參閱 Azure Databricks 如何管理 Delta Lake 功能相容性?

您可以使用下列語法,在現有的未分割 Delta 資料表上啟用液體叢集:

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

覆寫預設功能開啟(選擇性)

您可以覆寫在液體叢集啟用期間啟用 Delta 資料表功能的預設行為。 這可防止與這些數據表功能相關聯的讀取器和寫入器通訊協議升級。 您必須有現有的資料表,才能完成下列步驟:

  1. 使用 ALTER TABLE 來設定停用一或多個功能的數據表屬性。 例如,若要停用刪除向量,請執行下列動作:

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

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

下表提供您可以覆寫之 Delta 功能的相關信息,以及啟用對 Databricks 運行時間版本的相容性有何影響。

差異功能 運行時間相容性 要覆寫啟用的屬性 停用對液體群集的影響
刪除向量 讀取和寫入需要 Databricks Runtime 12.2 lTS 和更新版本。 'delta.enableDeletionVectors' = false 數據列層級並行存取已停用,使得交易和叢集作業更有可能發生衝突。 請參閱<資料列層級並行寫入衝突>。

DELETEMERGEUPDATE 命令的執行速度可能會變慢。
資料列追蹤 寫入需要 Databricks Runtime 13.3 LTS 和更新版本。 可以從任何 Databricks 執行時間版本讀取。 'delta.enableRowTracking' = false 數據列層級並行存取已停用,使得交易和叢集作業更有可能發生衝突。 請參閱<資料列層級並行寫入衝突>。
檢查點 V2 讀取和寫入需要 Databricks Runtime 13.3 LTS 和更新版本。 'delta.checkpointPolicy' = 'classic' 不會影響液體群集行為。

選擇叢集金鑰

Databricks 建議根據常用的查詢篩選來選擇叢集索引鍵。 叢集索引鍵可以依任何順序定義。 如果兩個數據行相互關聯,您只需要將其中一個數據行新增為叢集索引鍵。

您可以將最多 4 個資料行指定為叢集索引鍵。 您只能指定具有收集的統計資料的資料行作為叢集索引鍵。 依預設,差異資料表中的前 32 個資料行已收集統計資料。 請參閱<指定 Delta 統計資料資料欄>。

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

  • Date
  • 時間戳記
  • TimestampNTZ (需要 Databricks Runtime 14.3 LTS 或更新版本)
  • String
  • 整數
  • Long
  • Short
  • Float
  • Double
  • Decimal
  • Byte

如果您要轉換現有的數據表,請考慮下列建議:

目前的數據優化技術 叢集金鑰的建議
Hive 樣式的數據分割 使用分割區數據行作為叢集索引鍵。
Z 順序索引編製 使用數據 ZORDER BY 行作為叢集索引鍵。
Hive 樣式的數據分割和 Z 順序 同時使用數據分割數據行和數據 ZORDER BY 行作為叢集索引鍵。
產生的資料列以減少基數(例如時間戳的日期) 使用原始數據行作為叢集索引鍵,而且不會建立產生的數據行。

將數據寫入叢集數據表

您必須使用支援液體叢集使用之所有 Delta 寫入通訊協定資料表功能的 Delta 寫入器用戶端。 在 Azure Databricks 上,您必須使用 Databricks Runtime 13.3 LTS 和更新版本。

寫入時叢集的作業包括下列各項:

  • INSERT INTO 項作業
  • CTASRTAS 語句
  • COPY INTO 從 Parquet 格式
  • spark.write.mode("append")

結構化串流寫入永遠不會在寫入時觸發叢集。 套用其他限制。 請參閱限制

只有在交易中的數據符合大小閾值時,才會在寫入時觸發叢集。 這些臨界值會因叢集數據行數目而有所不同,而 Unity 目錄受控數據表則低於其他差異數據表。

叢集數據行數目 Unity 目錄受控數據表的臨界值大小 其他 Delta 數據表的臨界值大小
1 64 MB 256 MB
2 256 MB 1 GB
3 512 MB 2 GB
4 1 GB 4 GB

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

如何觸發叢集

預測優化會自動執行 OPTIMIZE 已啟用資料表的命令。 請參閱 Unity Catalog 受控資料表的預測性最佳化

若要觸發叢集,您必須使用 Databricks Runtime 13.3 LTS 或更新版本。 OPTIMIZE使用資料表上的 命令,如下列範例所示:

OPTIMIZE table_name;

液體叢集是累加式的,這表示數據只會視需要重寫,以容納需要叢集的數據。 具有不符合叢集數據叢集索引鍵的數據檔不會重寫。

為了獲得最佳效能,Databricks 建議將一般 OPTIMIZE 作業排程到叢集數據。 對於遇到許多更新或插入的數據表,Databricks 建議每隔一兩小時排程一 OPTIMIZE 次作業。 因為液體叢集是累加式的,因此叢集數據表的大部分 OPTIMIZE 作業都會快速執行。

從叢集數據表讀取數據

您可以使用支援讀取刪除向量的任何 Delta Lake 用戶端,讀取叢集數據表中的數據。 如需最佳查詢結果,請在查詢篩選中包含叢集索引鍵,如下列範例所示:

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

變更叢集金鑰

您可以執行 ALTER TABLE 命令,隨時變更資料表的叢集索引鍵,如下列範例所示:

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

當您變更叢集金鑰時,後續 OPTIMIZE 和寫入作業會使用新的叢集方法,但不會重寫現有的數據。

您也可以將金鑰設定為 NONE關閉叢集,如下列範例所示:

ALTER TABLE table_name CLUSTER BY NONE;

將叢集金鑰設定為 NONE 不會重寫已叢集的數據,但可防止未來的 OPTIMIZE 作業使用叢集密鑰。

查看數據表的叢集方式

您可以使用 DESCRIBE 命令來檢視資料表的叢集索引鍵,如下列範例所示:

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

與液體叢集的數據表相容性

根據預設,在 Databricks Runtime 14.1 和更新版本中使用 v2 檢查點建立的數據表。 您可以在 Databricks Runtime 13.3 LTS 和更新版本中使用 v2 檢查點讀取和寫入數據表。

您可以在 Databricks Runtime 12.2 LTS 和更新版本停用 v2 檢查點和降級數據表通訊協定,以讀取具有液體叢集的數據表。 請參閱卸除 Delta 資料表功能

限制

存在下列限制:

  • 在 Databricks Runtime 15.1 和以下版本中,寫入上的叢集不支援包含篩選、聯結或匯總的來源查詢。
  • 結構化串流工作負載不支援寫入時叢集處理。
  • 您無法使用結構化串流寫入來建立已啟用液體叢集的數據表。 您可以使用結構化串流將資料寫入已啟用液體叢集的現有資料表。