对 Delta Lake 的排序规则支持
可以在 Databricks Runtime 16.1 及更高版本中的 Delta 表中为字符串字段指定排序规则。
为表启用排序规则会添加 collations-preview
编写器表功能。 在 Databricks Runtime 15.4 及更高版本中,可以读取启用了排序规则的表。 请参阅 Azure Databricks 如何管理 Delta Lake 功能兼容性?。
注意
默认情况下,Delta Lake 将字符串字段的排序规则设置为 UTF8_BINARY
。
在列级别创建具有排序规则的表
可以使用以下命令在列级别创建具有排序规则的新表:
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
更改表列以指定排序规则
可以使用以下命令更新现有列以使用排序规则:
ALTER TABLE tableName ALTER COLUMN columnName TYPE newType
若要删除非默认排序规则(如果存在):
ALTER TABLE tableName ALTER COLUMN columnName TYPE STRING COLLATE UTF8_BINARY
若要将列排序规则更改为 utf8_lcase
:
ALTER TABLE tableName ALTER COLUMN columnName TYPE STRING COLLATE UTF8_LCASE
更改表的排序规则不会自动更新以前写入数据的统计信息或数据布局。 为了在新的排序规则下处理历史数据时改进文件跳过,Databricks 建议执行以下作:
- 运行
ANALYZE table_name COMPUTE DELTA STATISTICS
以更新现有数据文件的文件跳过统计信息。 - 对于启用了液体聚类分析的表,请运行
OPTIMIZE FULL table_name
以更新液体聚类分析。 - 对于使用
ZORDER
的表,请执行以下操作:使用以下命令替代默认 Spark 配置,在 Spark 会话中禁用增量优化:
SET spark.databricks.optimize.incremental=false
运行
OPTIMIZE table_name ZORDER BY zorder_column
以重写所有现有数据文件。
查询结果中的 Azure Databricks 将始终遵循排序规则。
为表禁用排序规则
在删除排序规则功能之前,必须为表中的每个字符串列显式禁用排序规则。
使用以下语法将列的排序规则设置为 UTF8_BINARY
:
ALTER TABLE table_name
ALTER COLUMN column_name
TYPE STRING
COLLATE UTF8_BINARY
若要删除表功能,请运行以下命令:
ALTER TABLE table_name
DROP FEATURE collations-preview
请参阅删除 Delta 表功能。
架构演变和排序规则
排序规则使用以下规则来应对架构演变:
- 如果目标表中已存在源列,则目标表中列的排序规则保持不变。
- 如果源列指定了排序规则,则添加到目标表的列使用指定的排序规则。
- 如果在添加具有排序规则的列时目标表未启用排序规则,则启用
collations-preview
表功能。
局限性
启用了排序规则的表存在以下限制:
- 使用 Databricks Runtime 无法识别的排序规则在外部创建的 Delta 表在查询时会引发异常。
- 不支持Delta Sharing。
- 排序列不能与
CHECK
约束一起使用。 - 生成的列不能使用排序规则。
- 排序列不能与布隆筛选器索引列一起使用。
- 适用于 Scala 或 Python 的 OSS Delta Lake API 不支持排序规则。 必须使用 Spark SQL API 或 DataFrame API 来启用排序规则。
- 排序列不支持动态分区覆盖。
- 结构化流式处理有状态查询中不能引用排序列。
- 不遵循
collations-preview
表功能的外部读取器将回退到UTF8_BINARY
的默认排序规则。 MAP
不能具有经过排序的字符串作为键。- UniForm 不适用于排序规则。