Delta Lake 的数据跳过
注意
在 Databricks Runtime 13.3 及更高版本中,Databricks 建议对 Delta 表布局使用 Liquid 聚类分析。 群集与 Z 排序不兼容。 请参阅对 Delta 表使用 liquid 聚类分析。
向 Delta 表中写入数据时,会自动收集跳过数据信息。 Azure Databricks 上的 Delta Lake 会在查询时利用此信息(最小值和最大值、null 值计数,以及每个文件的总记录数)来提供更快的查询。
你必须为 ZORDER
语句中使用的列收集统计信息。 请参阅什么是 Z 排序?
指定增量统计信息列
默认情况下,Delta Lake 收集表架构中定义的前 32 列的统计信息。
表属性 | 支持的 Databricks Runtime | 说明 |
---|---|---|
delta.dataSkippingNumIndexedCols |
所有支持的 Databricks Runtime 版本 | 增加或减少 Delta 收集统计信息的列数。 取决于列顺序。 |
delta.dataSkippingStatsColumns |
Databricks Runtime 13.3 LTS 及更高版本 | 指定 Delta Lake 为其收集统计信息的列名的列表。 取代了 dataSkippingNumIndexedCols 。 |
可以在创建表时或使用 ALTER TABLE
语句设置表属性。 请参阅 Delta 表属性参考。
更新这些属性不会自动重新计算现有数据的统计信息。 相反,在表中添加或更新数据时,它会影响将来的统计信息收集行为。 Delta Lake 不会利用统计信息列的当前列表中未包括的列的统计信息。
在 Databricks Runtime 14.3 LTS 及更高版本中,如果更改了表属性或更改了统计信息的指定列,则可以使用以下命令手动触发 Delta 表的统计信息重新计算:
ANALYZE TABLE table_name COMPUTE DELTA STATISTICS
注意
在统计信息收集期间会截断长字符串。 可以选择从统计信息集合中排除长字符串列,尤其是在这些列不经常用于筛选查询时。
什么是 Z 排序?
注意
Databricks 建议对所有新 Delta 表使用 Liquid 聚类分析。 不能将 ZORDER
与 Liquid 聚类分析结合使用。
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
命令本身的问题;它不应对后续查询产生任何负面影响。