Delta Lake で optimize を使用してデータ ファイルを圧縮する

OPTIMIZE」を参照してください。

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

Note

Databricks Runtime 13.3 以上での Databricks では、Delta テーブル レイアウトにクラスタリングを使用することを推奨しています。 「Delta テーブルに Liquid Clustering クラスタリングを使用する」を参照してください。

Databricks では、予測最適化を使い、差分テーブルに対して OPTIMIZE を自動的に実行することをお勧めします。 「Delta Lake の予測最適化」を参照してください。

構文の例

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

SQL

OPTIMIZE delta.`/data/events`

Python

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

Scala

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

または、次のようにします。

SQL

OPTIMIZE events

Python

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

Scala

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

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

SQL

OPTIMIZE events WHERE date >= '2022-11-18'

Python

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
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 を実行する必要がありますか?

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

Databricks では、まず OPTIMIZE を毎日実行してから、頻度を調整してコストとパフォーマンスのトレードオフのバランスを取ることをお勧めしています。

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

どちらの操作も、大量の Parquet デコードとエンコードを行う、CPU 集中型の操作です。

Databricks では、コンピューティング最適化インスタンスの種類を推奨しています。 OPTIMIZE は、アタッチされた SSD のメリットも得られます。