次の方法で共有


データ ファイル レイアウトを最適化する

予測最適化により、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 のメリットも得られます。