在 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
修改彙整後更新統計資料與資料配置
更改欄位的彙整不會重寫現有資料或更新統計數據。 查詢會在新的排序下立即回傳正確結果,但在你採取以下步驟之前,跳過檔案和叢集可能效果較差:
- 更新該欄的檔案跳過統計:
ANALYZE TABLE my_table COMPUTE DELTA STATISTICS
- 如果你的表格使用液體聚類,請重寫聚類版面:
OPTIMIZE FULL my_table
- 如果你的表格使用 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值支持排序