Delta Lake 的排序支援

在 Databricks Runtime 16.4 LTS 及更新版本中,您可以在 Delta Lake 資料表的字串欄位上指定定序規則,以在欄位層級控制字串比較和排序行為,例如啟用不區分大小寫的比對或區域設定感知排序。

關於排序類型、命名慣例及優先順序規則的完整說明,請參見 整合

根據預設,Delta Lake 會將字串字位的定序設定為 UTF8_BINARY

Important

啟用定序會將 collations writer table 功能新增至您的 Delta Lake 資料表,這會影響其與外部讀取程式及其他平台功能的相容性。 在啟用生產表的彙整前,請先檢視 限制 部分。

建立一個包含排序的資料表

你可以在建立新資料表時,在欄位層級指定整合。 排序可應用於頂層字串欄位以及巢狀型別內的字串欄位:

CREATE TABLE catalog.schema.my_table (
  id BIGINT,
  name STRING COLLATE UTF8_LCASE,
  metadata STRUCT<label: STRING COLLATE UNICODE>,
  tags ARRAY<STRING COLLATE UTF8_LCASE>,
  properties MAP<STRING, STRING COLLATE UTF8_LCASE>
) USING delta

Note

MAP 鍵無法使用排序規則。 只有 MAP 值支援整合字串。

在現有欄位上修改排序規則

你可以用 ALTER TABLE來更改現有欄位的整合。

例如,要將欄位設定為大小寫不區分的排序:

ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_LCASE

例如,要將欄位還原為預設的二進位排序:

--
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY

修改彙整後更新統計資料與資料配置

更改欄位的彙整不會重寫現有資料或更新統計數據。 查詢會在新的排序下立即回傳正確結果,但在你採取以下步驟之前,跳過檔案和叢集可能效果較差:

  1. 更新該欄的檔案跳過統計:
   ANALYZE TABLE my_table COMPUTE DELTA STATISTICS
  1. 如果你的表格使用液體聚類,請重寫聚類版面:
   OPTIMIZE FULL my_table
  1. 如果你的表格使用 ZORDER,請關閉增量優化並重寫所有檔案:
   SET spark.databricks.optimize.incremental = false;
   OPTIMIZE my_table ZORDER BY zorder_column;

跳過這些步驟不會導致錯誤結果,但可能會降低歷史資料的查詢效能,直到下一次完整重寫。

Azure Databricks 在查詢結果中一律遵循排序規則。

關閉資料表的定序

要移除彙整表功能,請將每個彙整的欄位設回為 UTF8_BINARY

首先,對每個彙整的欄位執行此指令:

ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY

然後,移除表格功能:

ALTER TABLE my_table DROP FEATURE collations

詳情請參閱 刪除 Delta Lake 資料表功能與降級資料表協議

模式演化與排序

當結構演化新增或合併已指定的排序欄位時,適用以下規則:

  • 如果目標資料表中已經存在來源欄位,該欄位的整合資料會被保留。 來源欄位的整合則被忽略。
  • 若來源欄位為新欄位且指定了排序,目標表格會採用該排序作為新欄位。
  • 如果目標資料表尚未啟用 collations 功能,新增匯編欄位會自動啟用該功能。

Limitations

以下限制適用於啟用整合的三角洲湖資料表:

相容性與互通性:

  • 外部讀者若不認識表格 collations 功能,會回退到 UTF8_BINARY,這可能導致錯誤的排序順序或比較。
  • OpenSharing 不支援在非預設的整合欄位中共享個別分割區。 不如共用一張桌子。
  • UniForm 不支援有整合的資料表。
  • 在外部建立且使用 Databricks Runtime 無法辨識的定序規則的 Delta Lake 資料表,在查詢時會引發例外。
  • Scala 或 Python 的 OSS Delta Lake API 不支援整合功能。 使用 Spark SQL 或 DataFrame API。

查詢與功能限制:

  • 彙整欄位不能用於 CHECK 限制
  • 彙整欄位無法在產生的欄位表達式中被引用
  • 合併欄位無法與bloom filter索引一起使用(已棄用)
  • 在結構化串流的有狀態查詢(聚合、連接、去重)中,無法引用彙整欄位
  • MAP金鑰不可能是一串合併的字串。 只有 MAP 值支持排序

其他資源