Delta Lake 的排序支援
您可以在 Databricks Runtime 16.1 和更新版本中指定 Delta tables 字串字段的定序。
啟用 table 定序會新增 collations-preview
寫入器 table 功能。 您可以在 Databricks Runtime 15.4 和更高版本中啟用排序來讀取 tables。 請參閱 Azure Databricks 如何管理 Delta Lake 功能相容性?。
注意
根據預設,Delta Lake 會將字串字位的定序設定為 UTF8_BINARY
。
使用 column 層級的定序建立 table
您可以使用下列命令,在 column 層級建立具有定序的新 table:
CREATE TABLE $tableName (
nonCollatedColName STRING,
collatedColName STRING COLLATE UNICODE,
structColName STRUCT<nestedFieldName: STRING COLLATE UNICODE>,
mapColName MAP<STRING, STRING COLLATE UNICODE>,
arrayColName ARRAY<STRING COLLATE UNICODE>
) USING delta
更改 tablecolumn 以指定排序
您可以使用下列命令來 update 現有的 column,以進行定序:
ALTER TABLE tableName ALTER COLUMN columnName TYPE newType
若要 remove 非預設定序(如果有的話):
ALTER TABLE tableName ALTER COLUMN columnName TYPE STRING COLLATE UTF8_BINARY
若要將 column 定序變更為 utf8_lcase
:
ALTER TABLE tableName ALTER COLUMN columnName TYPE STRING COLLATE UTF8_LCASE
改變 table 的定序不會自動 update 先前寫入數據的統計數據或數據配置。 為了在新的定序下更有效地略過歷程記錄數據檔案,Databricks 建議採取以下措施:
- 執行
ANALYZE table_name COMPUTE DELTA STATISTICS
以 update 檔案略過現有數據檔的統計數據。 - 針對已啟用液體群集的 tables,請執行從
OPTIMIZE FULL table_name
到 update 的液體群集。 - 對於使用
ZORDER
的 tables,請執行下列動作:使用下列命令覆寫預設 Spark 組態,以停用 Spark 會話中的累加優化:
SET spark.databricks.optimize.incremental=false
執行
OPTIMIZE table_name ZORDER BY zorder_column
以重寫所有現有的數據檔。
Azure Databricks 一律會在查詢結果中遵守定序規則。
停用 table 的定序
在卸除定序功能之前,您必須明確地為 table 中的每個字串 column 停用定序。
使用以下語法來為 column 至 UTF8_BINARY
進行 set 定序:
ALTER TABLE table_name
ALTER COLUMN column_name
TYPE STRING
COLLATE UTF8_BINARY
若要卸除 table 功能,請執行下列命令:
ALTER TABLE table_name
DROP FEATURE collations-preview
請參閱 Drop Delta table 功能。
Schema 演進和定序
定序會使用下列規則與 schema 演進互動:
- 如果目標 table中已經有來源 column,則目標 table 中的 column 定序會保持不變。
- 如果來源 column 已指定定序,則新增至目標 table 的 column 會使用指定的定序。
- 當添加具有定序的 column 時,若目標 table 尚未啟用定序,則將啟用
collations-preview
table 功能。
局限性
啟用排序的 tables 存在下列限制:
- 以使用 Databricks Runtime 無法辨識的排序規則在外部建立的 Delta tables 會在查詢時引發例外狀況。
- 不支援Delta Sharing。
- 排列 columns 不能與
CHECK
條件約束一起搭配使用。 - 產生的 columns 無法使用定序。
- 定序 columns 無法搭配 bloom 篩選索引 columns使用。
- OSS Delta Lake API for Scala 或 Python 不支援定序。 您必須使用 Spark SQL 或 DataFrame API 來啟用定序。
- 定序 columns不支援動態 partition 覆寫。
- 在帶狀態的結構化串流查詢中,排版 columns 無法被引用。
- 不符合
collations-preview
table 功能後援的外部讀取器,會回復為預設UTF8_BINARY
定序。 -
MAP
不能有已排序的字串作為鍵值。 - UniForm 不適用於定序。