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
以更新 现有数据文件的文件跳过统计信息。 - 对于启用了 Liquid 聚类分析的表,请运行
OPTIMIZE FULL table_name
以更新 Liquid 聚类分析。 - 对于使用
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 Sharing。
- 排序规则列不能与
CHECK
约束一起使用 。 - 生成的列不能使用排序规则。
- 排序规则列不能与布隆筛选器索引列一起使用。
- OSS Delta Lake API for Scala 或 Python 中不支持排序规则。 必须使用 Spark SQL 或数据帧 API 来启用排序规则。
- 排序规则列上不支持动态分区覆盖。
- “结构化流式处理”有状态查询中不能引用排序规则列。
- 不遵循
collations-preview
表功能的外部读取器会回退到UTF8_BINARY
的默认排序规则。 MAP
没有属于排序规则字符串的密钥。- UniForm 不适用于排序规则。