在 Databricks Runtime 16.4 LTS 及更高版本中,可为 Delta Lake 表中的字符串字段指定排序规则,以在列级别控制字符串比较和排序行为,例如启用不区分大小写的匹配或按区域设置排序。
有关排序规则类型、命名约定和优先规则的完整说明,请参阅 排序规则。
默认情况下,Delta Lake 将字符串字段的排序规则设置为 UTF8_BINARY。
Important
启用排序规则会向你的 Delta Lake 表添加 collations 写入器表特性,这会影响与外部读取器和其他平台功能的兼容性。 在对生产表启用排序规则之前,请查看限制部分。
创建具有排序方式的表
创建新表时,可以在列级别指定排序规则。 排序规则可应用于顶级字符串列和嵌套类型内的字符串字段:
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表功能,添加排序列会自动启用该功能。
局限性
以下限制适用于启用了排序规则的 Delta Lake 表:
兼容性和互作性:
- 无法识别
collations表功能的外部读取器回退到UTF8_BINARY,这可能会生成不正确的排序顺序或比较。 - OpenSharing 不支持在非默认排序规则列上共享单个分区。 请共享该表。
- UniForm 不支持使用排序规则的表。
- 使用 Databricks Runtime 无法识别的排序规则外部创建的 Delta Lake 表在被查询时会引发异常。
- 适用于 Scala 或 Python 的 OSS Delta Lake API 不支持排序规则。 使用 Spark SQL 或数据帧 API。
查询和功能限制:
- 排序规则列不能在
CHECK约束中使用 - 排序规则列不能在生成的列表达式中引用
- 排序规则列不能与布隆筛选器索引(已弃用)一起使用
- 排序规则列不能在结构化流有状态查询(聚合、联接、去重)中引用。
-
MAP键不能是排序字符串。 仅MAP值支持排序规则