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.
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.0 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 kleine Dateien mithilfe der automatischen Optimierung in Azure Databricks auch automatisch komprimieren.
Wie häufig sollte OPTIMIZE
ausgeführt werden?
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-Packing 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.