Delta Lake 的排序规则支持

在 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

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

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

  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

首先,对每个使用排序规则的列运行此命令:

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 值支持排序规则

其他资源