OPTIMIZE
适用于: Databricks SQL Databricks Runtime
优化 Delta Lake 数据的布局。 (可选)优化数据子集或按列并置数据。 如果未指定并置,并且表未使用 Liquid 聚类分析定义,则执行装箱打包优化。
语法
OPTIMIZE table_name [FULL] [WHERE predicate]
[ZORDER BY (col_name1 [, ...] ) ]
注意
- 二进制打包优化幂等,这意味着如果在同一数据集上运行两次,则第二次运行不起作用。 它旨在根据文件在磁盘上的大小生成均衡的数据文件,但不一定是每个文件的元组数。 但是,这两个度量值通常是相关的。
- Z 排序不是幂等的,而应该是增量操作。 多次运行不能保证 Z 排序所需的时间减少。 但是,如果没有将新数据添加到刚刚进行 Z 排序的分区,则该分区的另一个 Z 排序将不会产生任何效果。 它旨在根据元组的数量生成均衡的数据文件,但不一定是磁盘上的数据大小。 这两个度量值通常是相关的,但可能会有例外的情况,导致优化任务时间出现偏差。
注意
使用 Databricks Runtime 时,若要控制输出文件大小,请设置 Spark 配置spark.databricks.delta.optimize.maxFileSize
。 默认值为 1073741824
,该值会将大小设置为 1 GB。 指定值 104857600
会将文件大小设置为 100 MB。
参数
-
标识现有的 Delta 表。 名称不得包含 时态规范或选项规范。
FULL
适用于: Databricks Runtime 16.0 及更高版本
优化整个表,包括以前可能已聚集的数据。 只能为使用 liquid 聚类分析的表指定此子句。
WHERE
优化与给定分区谓词匹配的行子集。 仅支持涉及分区键属性的筛选器。
无法对使用 Liquid 聚类分析的表使用此子句。
ZORDER BY
将列信息并置在同一组文件中。 Delta Lake 数据跳过算法会使用并置,大幅减少需要读取的数据量。 可以将
ZORDER BY
的多个列指定为以逗号分隔的列表。 但是,区域的有效性会随每个附加列降低。无法对使用 Liquid 聚类分析的表使用此子句。
示例
> OPTIMIZE events;
> OPTIMZIE events FULL;
> OPTIMIZE events WHERE date >= '2017-01-01';
> OPTIMIZE events
WHERE date >= current_timestamp() - INTERVAL 1 day
ZORDER BY (eventType);
有关 OPTIMIZE
命令的详细信息,请参阅优化数据文件布局。