Delta Lake 的数据跳过

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

注意

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

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

指定增量统计信息列

默认情况下,Delta Lake 收集表架构中定义的前 32 列的统计信息。 对于此集合,嵌套列中的每个字段都被视为单个列。 可以通过设置以下表属性之一来修改此行为:

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

可以在创建表时或使用 ALTER TABLE 语句设置表属性。 请参阅 Delta 表属性参考

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

在 Databricks Runtime 14.3 LTS 及更高版本中,可以使用以下命令手动触发 Delta 表的统计数据重新计算:

ANALYZE TABLE table_name COMPUTE DELTA STATISTICS

注意

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

什么是 Z 排序?

Z 排序是并置同一组文件中相关信息的方法。 Azure Databricks 上的 Delta Lake 数据跳过算法会自动使用此并置。 此行为显著减少了 Azure Databricks 上的 Delta Lake 需要读取的数据量。 若要对数据进行 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 命令本身的问题;它不应对后续查询产生任何负面影响。