可以对 Delta 表中的字符串字段指定排序规则,以控制字符串比较和排序的行为方式,例如启用不区分大小写的匹配或区域设置感知排序。 这需要 Databricks Runtime 16.4 LTS 及更高版本。
有关排序规则类型、命名约定和优先规则的完整说明,请参阅 排序规则。
默认情况下,Delta Lake 将字符串字段的排序规则设置为 UTF8_BINARY。
重要
启用字符排序会将 collations 写表功能添加到 Delta 表,这会影响与外部读取器和其他平台功能的兼容性。 在对生产表启用排序规则之前,请查看 “限制 ”部分。
创建具有排序方式的表
创建新表时,可以在列级别指定排序规则。 排序规则可以应用于嵌套类型中的顶级字符串列和字符串字段:
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
注意
MAP 主键无法使用排序规则。 仅 MAP 值支持集合的字符串。
更改现有列的排序规则
可以使用 ALTER TABLE 更改现有列的排序规则。
-- Set a column to case-insensitive collation
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_LCASE
-- Revert a column to the default binary collation
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:
-- Repeat for each collated column
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY
然后删除表功能:
ALTER TABLE my_table DROP FEATURE collations
有关更多详细信息,请参阅 “删除 Delta Lake 表”功能和降级表协议 。
模式演变和排序规则
当架构演变添加或合并指定排序规则的列时,以下规则适用:
- 如果目标表中已存在源列,则会保留该列的目标表的排序规则。 将忽略源列的排序规则。
- 如果源列是新的并且指定了排序规则,则目标表将采用新列的排序规则。
- 如果目标表尚未启用
collations表功能,添加排序列会自动启用该功能。
局限性
以下限制适用于启用了排序规则的 Delta 表:
兼容性和互作性:
- 无法识别
collations表功能的外部读取器将使用UTF8_BINARY作为备选方案,这可能会导致排序顺序或比较结果不正确。 - 具有排序规则的表不适用于Delta Sharing。
- 不支持具有排序规则的表的 UniForm
- 在外部创建并使用 Databricks Runtime 无法识别的排序规则的 Delta 表在查询时会引发异常。
- 适用于 Scala 或 Python 的 OSS Delta Lake API 不支持排序规则。 使用 Spark SQL 或数据帧 API
查询和功能限制:
- 已排序的列不能用于
CHECK约束 - 无法在生成列表达式中引用排序次序列
- 排序列不能与 Bloom 过滤器索引一起使用
- 在结构化流式处理的状态查询中,无法引用排序的列(聚合、连接、重复数据删除)
-
MAP键不能是排序字符串。 仅MAP值支持排序规则