跳过数据

注意

在 Databricks Runtime 13.3 及更高版本中,Databricks 建议对表布局使用液体聚类分析。 群集与 Z 排序不兼容。 请参阅 对表使用液体聚类分析

将数据写入表中时,会自动收集跳过数据的信息。 Azure Databricks 利用此信息(查询时每个文件的最小值和最大值、null 计数和总记录数),以提供更快的查询。

你必须为 ZORDER 语句中使用的列收集统计信息。 请参阅什么是 Z 排序?

指定统计信息列

对于 Unity 目录 外部表,统计信息默认收集在表架构中定义的前 32 列。 对于 Unity Catalog 托管表,智能地使用预测优化进行文件跳过统计信息的选择,并且没有 32 列的限制。

如果不使用预测优化,可以通过设置下表属性之一来修改将统计信息集合限制为 32 列的行为:

表属性 支持的 Databricks Runtime 说明
dataSkippingNumIndexedCols 所有支持的 Databricks Runtime 版本 增加或减少收集统计信息的列数。 这取决于列的顺序。
dataSkippingStatsColumns Databricks Runtime 13.3 LTS 及更高版本 指定为其收集统计信息的列名的列表。 取代了 dataSkippingNumIndexedCols

可以在创建表时或使用 ALTER TABLE 语句设置表属性。 请参阅 表属性参考。 下面的示例修改了默认的统计信息收集行为,以便在指定的列上收集统计信息:

Delta 表

ALTER TABLE table_name SET TBLPROPERTIES('delta.dataSkippingStatsColumns' = 'col1, col2, col3')

冰山表

ALTER TABLE table_name SET TBLPROPERTIES('iceberg.dataSkippingStatsColumns' = 'col1, col2, col3')

更新这些属性不会自动重新计算现有数据的统计信息。 相反,在表中添加或更新数据时,它会影响将来的统计信息收集行为。 统计信息不用于当前统计信息列列表中不包含的列。

在 Databricks Runtime 14.3 LTS 及更高版本中,如果更改表属性或更改用于统计信息的指定列,则可以手动使用以下命令重新计算表的统计信息:

ANALYZE TABLE table_name COMPUTE DELTA STATISTICS

注意

在统计信息收集期间会截断长字符串。 可以选择从统计信息集合中排除长字符串列,尤其是在这些列不经常用于筛选查询时。

什么是 Z 排序?

注意

Databricks 建议对所有新表使用液体聚类分析。 不能将 ZORDER 与 Liquid 聚类同时使用。 请参阅 对表使用液体聚类分析

Z 排序是并置同一组文件中的相关信息的方法。 Azure Databricks 数据跳过算法会自动使用此共同区域。 此行为可减少需要读取的数据量。 要对数据进行 Z 顺序排序,请在 ZORDER BY 子句中指定排序的列:

OPTIMIZE events
WHERE date >= current_timestamp() - INTERVAL 1 day
ZORDER BY (eventType)

如果希望在查询谓词中常规使用某一列,并且该列具有较高的基数(即包含多个非重复值),请使用 ZORDER BY

可以将 ZORDER BY 的多个列指定为以逗号分隔的列表。 然而,局部性的效果会随着每增加一列而下降。 对未收集统计信息的列进行 Z 顺序排序不会有效果,而且只会浪费资源。 这是因为数据跳过需要列级统计信息,例如最小值、最大值和计数。 可通过对架构中的列重新排序来对某些列配置统计信息收集,也可增加从中收集统计信息的列数。

注意

  • Z 排序不是幂等的,但其目标是成为一种增量操作。 多次运行不能保证 Z 排序所需的时间减少。 但是,如果没有将新数据添加到刚刚进行 Z 排序的分区,则该分区的另一个 Z 排序将不会产生任何效果。

  • Z 顺序排序旨在使数据文件在元组数量上保持均衡,但不一定能保证其磁盘占用大小也同样均衡。 这两个度量值通常是相关的,但可能会有例外的情况,导致优化任务时间出现偏差。

    例如,如果 ZORDER BY 日期,并且最新记录的宽度比过去多很多(例如数组或字符串值较长),则 OPTIMIZE 作业的任务持续时间和所生成文件的大小都会出现偏差。 但这只是 OPTIMIZE 命令本身的问题;它不应对后续查询产生任何负面影响。