共用方式為


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-previewtable 功能。

局限性

啟用排序的 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-previewtable 功能後援的外部讀取器,會回復為預設 UTF8_BINARY定序。
  • MAP 不能有已排序的字串作為鍵值。
  • UniForm 不適用於定序。