データファイルのレイアウトを最適化する
OPTIMIZE
コマンドは、 Deltaテーブルのデータ レイアウトを改善するためにデータ ファイルを書き換えます。 リキッドクラスタリングが有効になっているテーブルの場合、 OPTIMIZE
データ ファイルをリキッドクラスタリング キーによってグループ データに書き換えます。 パーティションが定義されているテーブルの場合、ファイルの圧縮とデータレイアウトはパーティション内で実行されます。
リキッドクラスタリングのないテーブルには、書き換え時のデータ クラスタリングを向上させるために、オプションでZORDER BY
句を含めることができます。 Databricks 、パーティション、ZORDER
、またはその他のデータ レイアウト アプローチの代わりに、リキッドクラスタリングを使用することをお勧めします。
「最適化」を参照してください。
重要
Databricks Runtime 16.0 以降では、OPTIMIZE FULL
を使用して、リキッドクラスタリングが有効になっているテーブルの再クラスタリングを強制できます。「すべてのレコードの再クラスタリングの強制」を参照してください。
構文の例
圧縮をトリガーするには、 OPTIMIZE
コマンドを実行します。
OPTIMIZE table_name
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
大量のデータがあり、そのサブセットのみを最適化する場合は、 WHERE
を使用してオプションのパーティション述語を指定できます。
OPTIMIZE table_name WHERE date >= '2022-11-18'
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
注
ビンパッキングの最適化は べき等であり、同じデータセットで 2 回実行しても、2 回目の実行は効果がありません。
ビンパッキングは、ディスク上のサイズに関して均等にバランスのとれたデータファイルを生成することを目的としていますが、必ずしもファイルあたりのタプルの数ではありません。 ただし、ほとんどの場合、2つの測定値は相関しています。
OPTIMIZE
操作を実行するためのPythonおよびScala APIs Databricks Runtime 11.3 LTS以降で利用できます。
Delta テーブルのリーダーはスナップショット分離を使用します。つまり、 OPTIMIZE
がトランザクション ログから不要なファイルを削除しても、スナップショット テーブルは中断されません。 OPTIMIZE
はテーブルにデータ関連の変更は行わないため、 OPTIMIZE
の前後に読み取っても同じ結果が得られます。 ストリーミングソースであるテーブルで OPTIMIZE
を実行しても、このテーブルをソースとして扱う現在または将来のストリームには影響しません。 OPTIMIZE
は、削除されたファイルと操作によって追加されたファイルのファイル統計 (最小、最大、合計など) を返します。 最適化統計には、Z-ordering 統計、バッチ数、最適化されたパーティションも含まれます。
自動圧縮を使用して、小さなファイルを自動的に圧縮することもできます。 Databrick s で の Delt a Lake の自動圧縮 を参照してください。