通过


对 Delta Lake 的排序规则支持

可以对 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

更改排序规则后更新统计信息和数据布局

更改列的排序规则不会重写现有数据或更新统计信息。 查询会立即在新排序规则下返回正确的结果,但在执行以下步骤之前,文件跳过和聚类分析可能不太有效:

  1. 更新列的文件跳过统计信息:
   ANALYZE TABLE my_table COMPUTE DELTA STATISTICS
  1. 如果表使用液体聚类分析,请重写聚类分析布局:
   OPTIMIZE FULL my_table
  1. 如果表使用 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 值支持排序规则