Optimize (Delta Lake on Databricks) | Databricks on AWS [2021/4/5時点]の翻訳です。
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
Delta Lakeデータのレイアウトを最適化します。オプションとして、カラムを指定することでデータのサブセットを最適化したり、データを近い場所に配置することができます。カラムを指定しない場合にはbin-packingの最適化が実行されます。
注意
- Bin-packingの最適化は冪等性が保証されるので、同じデータセットに対して2回実行したとしても、2回目の実行の効果はありません。ディスク上のデータファイルのサイズに基づいて、均等にバランスされたデータファイルを生成しようとしますが、ファイルごとのタプルの数が必ずしも均等になるわけではありません。しかし、これら二つの指標は多くの場合相関します。
- Z-Orderingは冪等性が保証されませんが、インクリメンタルな処理を行おうとします。複数回のZ-Orderingで処理に要する時間が削減されることは保証されません。しかし、Z-Orderingが実行された直後のパーティションに新規データが追加されない場合、当該パーティションに対するさらなるZ-Orderingには効果がありません。タプルの数に基づいて均等なデータファイルを作成しようとしますが、ディスク上のデータファイルサイズが必ずしも均等になるわけではありません。これらの二つの指標は多くの場合相関しますが、そうでない場合もありえますし、最適化タスクの時間に偏りが発生することもあります。
- アウトプットのファイルサイズを制御するためには、Spark設定の
spark.databricks.delta.optimize.maxFileSize
を指定します。デフォルトは1073741824
であり、1GBとなります。値を104857600
とすることで、100MBのファイルサイズに指定することができます。
WHERE
指定されたパーティション述語にマッチする行のサブセットを最適化します。パーティションキー属性を含むフィルター条件のみがサポートされています。
ZORDER BY
カラム情報を同じファイルセットにコロケートします。読み込みに必要なデータの量を劇的に削減するために、Delta Lakeのデータスキッピングアルゴリズムによってこの局所性が活用されます。カンマ区切りのリストとして複数のカラムをZORDER BY
に指定することができます。しかし、カラムを追加するごとに局所性は損なわれます。
例
SQL
OPTIMIZE events
OPTIMIZE events WHERE date >= '2017-01-01'
OPTIMIZE events
WHERE date >= current_timestamp() - INTERVAL 1 day
ZORDER BY (eventType)