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。

参数

  • table_name

    标识现有的 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 命令的详细信息,请参阅优化数据文件布局