Komprimieren von Datendateien mit OPTIMIZE in Delta Lake

Weitere Informationen finden Sie unter OPTIMIZE.

Delta Lake in Azure Databricks kann die Geschwindigkeit von Leseabfragen aus einer Tabelle verbessern. Eine dieser Möglichkeiten zur Steigerung der Geschwindigkeit besteht darin, kleine Dateien in größeren zusammenzufügen.

Hinweis

In Databricks Runtime 13.3 und höher empfiehlt Databricks die Verwendung von Clustering für das Delta-Tabellenlayout. Weitere Informationen finden Sie unter Verwenden von Liquid Clustering für Delta-Tabellen.

Databricks empfiehlt die Verwendung der prädiktiven Optimierung, um OPTIMIZE automatisch für Deltatabellen auszuführen. Weitere Informationen finden Sie unter Prädiktive Optimierung für Delta Lake.

Syntaxbeispiele

Sie lösen die Komprimierung aus, indem Sie den Befehl OPTIMIZE ausführen:

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()

oder alternativ:

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()

Wenn Sie über eine große Datenmenge verfügen und nur eine Teilmenge davon optimieren möchten, können Sie mit WHERE ein optionales Partitionsprädikat angeben:

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()

Hinweis

  • Die Bin-Packing-Optimierung ist idempotent. Dies bedeutet, dass bei einer zweimaligen Ausführung für dasselbe Dataset der zweite Durchlauf keine Auswirkungen hat.
  • Das Bin-Packing zielt darauf ab, gleichmäßige Datendateien in Bezug auf deren Größe auf dem Datenträger zu erzeugen, nicht notwendigerweise in Bezug auf die Anzahl von Tupeln pro Datei. Die beiden Kennzahlen sind jedoch sehr häufig korreliert.
  • Python- und Scala-APIs zum Ausführen des Vorgangs OPTIMIZE stehen ab Databricks Runtime 11.3 LTS zur Verfügung.

Delta-Tabellen-Reader verwenden die Momentaufnahmeisolation, d. h. es erfolgt keine Unterbrechung, wenn OPTIMIZE unnötige Dateien aus dem Transaktionsprotokoll entfernt. OPTIMIZE nimmt keine datenbezogenen Änderungen an der Tabelle vor, so dass ein Lesevorgang vor und nach einem OPTIMIZE-Befehl zu den gleichen Ergebnissen führt. Die Ausführung von OPTIMIZE für eine Tabelle, bei der es sich um eine Streamingquelle handelt, hat keine Auswirkungen auf aktuelle oder zukünftige Streams, die diese Tabelle als Quelle behandeln. OPTIMIZE gibt Dateistatistiken (Mindestwert, Höchstwert, Gesamtwert usw.) für die durch den Vorgang entfernten und hinzugefügten Dateien zurück. Die Optimierungsstatistiken enthalten auch Statistiken zur Z-Reihenfolge, die Anzahl von Stapeln und die optimierten Partitionen.

Sie können auch kleine Dateien mithilfe der automatischen Verdichtung automatisch verdichten. Weitere Informationen finden Sie unter Automatische Verdichtung für Delta Lake in Azure Databricks.

Wie häufig sollte ich OPTIMIZE ausführen?

Bei der Entscheidung, wie häufig OPTIMIZE ausgeführt werden sollte, muss zwischen Leistung und Kosten abgewogen werden. Führen Sie OPTIMIZE häufiger aus, um die Leistung von Endbenutzerabfragen zu verbessern. Dies verursacht aufgrund der erhöhten Ressourcennutzung höhere Kosten. Die Kosten können durch selteneres Ausführen optimiert werden.

Databricks empfiehlt, OPTIMIZE zunächst täglich auszuführen und dann die Häufigkeit anzupassen, um ein ausgewogenes Verhältnis zwischen Kosten und Leistung zu erzielen.

Welcher Instanztyp ist für die Ausführung von OPTIMIZE (Bin-Paketierung und Z-Reihenfolge) am besten geeignet?

Beide Vorgänge sind CPU-intensiv, da sie eine umfangreiche Parquet-Decodierung und -Codierung erfordern.

Databricks empfiehlt Instanzen vom Typ Für Compute optimiert. OPTIMIZE profitiert auch von angefügten SSDs.