Delta LakeでOPTIMIZEによりデータファイルを圧縮する

「最適化」を参照してください。

Databricks でDelta Lake を使用すると、テーブルからのクエリーの読み取り速度を向上させることができます。この速度を向上させる1つの方法は、小さなファイルを大きなファイルに結合することです。

Databricks Runtime 13.3 以降では、Databricks では、テーブル レイアウトDeltaクラスターを使用することをお勧めします。「 Deltaテーブルにリキッドクラスタリング使用する」を参照してください。

構文の例

圧縮をトリガーするには、 OPTIMIZE コマンドを実行します。

OPTIMIZE delta.`/data/events`
from delta.tables import *
deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()
import io.delta.tables._
val deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()

または、代わりに:

OPTIMIZE events
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().executeCompaction()
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().executeCompaction()

大量のデータがあり、そのサブセットのみを最適化する場合は、 WHEREを使用してオプションのパーティション述語を指定できます。

OPTIMIZE events WHERE date >= '2022-11-18'
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

  • ビンパッキングの最適化は べき等であり、同じデータセットで 2 回実行しても、2 回目の実行は効果がありません。

  • ビンパッキングは、ディスク上のサイズに関して均等にバランスのとれたデータファイルを生成することを目的としていますが、必ずしもファイルあたりのタプルの数ではありません。 ただし、ほとんどの場合、2つの測定値は相関しています。

  • OPTIMIZE 操作を実行するための Python と Scala APIs は、 Databricks Runtime 11.0 以降で利用できます。

Delta テーブルのリーダーはスナップショット分離を使用します。つまり、 OPTIMIZE がトランザクション ログから不要なファイルを削除しても、スナップショット テーブルは中断されません。 OPTIMIZE はテーブルにデータ関連の変更は行わないため、 OPTIMIZE の前後に読み取っても同じ結果が得られます。 ストリーミングソースであるテーブルで OPTIMIZE を実行しても、このテーブルをソースとして扱う現在または将来のストリームには影響しません。 OPTIMIZE は、削除されたファイルと操作によって追加されたファイルのファイル統計 (最小、最大、合計など) を返します。 最適化統計には、Z-ordering 統計、バッチ数、最適化されたパーティションも含まれます。

自動圧縮を使用して、小さなファイルを自動的に圧縮することもできます。 Databrick s で の Delt a Lake の自動圧縮 を参照してください。

どのくらいの頻度で OPTIMIZEを実行する必要がありますか?

OPTIMIZEを実行する頻度を選択する場合、パフォーマンスとコストの間にはトレードオフがあります。エンドユーザーのクエリのパフォーマンスを向上させるには、 OPTIMIZE をより頻繁に実行します。 これにより、リソース使用量が増えるため、コストが高くなります。 コストを最適化するには、実行頻度を減らします。

Databricks では、毎日 (できればスポット価格が低い夜間に) OPTIMIZE を実行することから始めて、コストとパフォーマンスのトレードオフのバランスを取るために頻度を調整することをお勧めします。

OPTIMIZE (ビンパッキングと Z オーダー) を実行するのに最適なインスタンスタイプは何ですか?

どちらの操作も、大量の Parquet のデコードとエンコードを実行する CPU を集中的に使用する操作です。

Databricks では、 コンピュートに最適化された インスタンスタイプを推奨しています。 OPTIMIZE 、接続されたSSDのメリットもあります。