データ ファイル レイアウトを最適化する
予測最適化により、Unity Catalog のマネージド テーブルに対して OPTIMIZE
が自動的に実行されます。 Databricks では、データのメンテナンスを簡素化し、ストレージ コストを削減するために、すべての Unity Catalog マネージド テーブルに対して予測最適化を有効にすることをお勧めします。 「Unity Catalog 管理テーブルの予測最適化」を参照してください。
OPTIMIZE
コマンドは、データ ファイルを書き換えて、Delta テーブルのデータ レイアウトを改善します。 リキッド クラスタリングが有効になっているテーブルの場合、OPTIMIZE
はデータ ファイルを書き換えて、リキッド クラスタリング キーによってデータをグループ化します。 パーティションが定義されているテーブルの場合、ファイル圧縮とデータ レイアウトはパーティション内で実行されます。
必要に応じて、リキッド クラスタリングのないテーブルに ZORDER BY
句を含め、書き換え時のデータ クラスタリングを改善できます。 Databricks では、パーティション、ZORDER
、またはその他のデータ レイアウト アプローチではなく、リキッド クラスタリングを使用することをお勧めします。
「OPTIMIZE」を参照してください。
構文の例
圧縮をトリガーするには、OPTIMIZE
コマンドを実行します。
SQL
OPTIMIZE table_name
Python
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
Scala
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
大量のデータがあり、そのサブセットのみを最適化する場合は、WHERE
を使用してオプションのパーティション述語を指定できます。
SQL
OPTIMIZE table_name WHERE date >= '2022-11-18'
Python
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
Scala
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 API は、Databricks Runtime 11.3 LTS 以上から入手できます。
Delta テーブルのリーダーではスナップショット分離を使用します。つまり、OPTIMIZE
によってトランザクション ログから不要なファイルを削除する際でも中断されません。 OPTIMIZE
によってテーブルに対するデータ関連の変更は行なわれないので、OPTIMIZE
の前と後の読み取りの結果は同じになります。 ストリーミング ソースであるテーブルに対して OPTIMIZE
を実行しても、このテーブルをソースとして扱う現在または将来のストリームには影響しません。 OPTIMIZE
を使用すると、操作によって削除されたファイルと追加されたファイルのファイル統計 (最小、最大、合計など) が返されます。 最適化統計には、Z オーダー統計、バッチの数、最適化されたパーティションも含まれます。
自動圧縮を使用して、小さなファイルを自動的に圧縮することもできます。 「Delta Lake on Azure Databricks の自動圧縮」を参照してください。
どれくらいの頻度で OPTIMIZE
を実行する必要がありますか?
Unity Catalog のマネージド テーブルの予測最適化を有効にして、コスト効率が高いときに OPTIMIZE
が自動的に実行されるようにします。
OPTIMIZE
の実行頻度を選択する場合、パフォーマンスとコストの間にトレードオフが生じます。 エンドユーザーのクエリ パフォーマンスを向上させるには、OPTIMIZE
をより高い頻度で実行します。 これにより、リソースの使用量が増加するため、コストが高くなります。 コストを最適化するには、実行頻度を減らします。
Databricks では、まず OPTIMIZE
を毎日実行してから、頻度を調整してコストとパフォーマンスのトレードオフのバランスを取ることをお勧めしています。
OPTIMIZE
(ビンパッキングと Z オーダー) を実行する最適なインスタンスの種類は何ですか?
どちらの操作も、大量の Parquet デコードとエンコードを行う、CPU 集中型の操作です。
Databricks では、コンピューティング最適化インスタンスの種類を推奨しています。 OPTIMIZE
は、アタッチされた SSD のメリットも得られます。