Optimieren des Datendateilayouts
Die Predictive Optimization führt automatisch OPTIMIZE
in verwalteten Tabellen in Unity Catalog aus. Databricks empfiehlt die Aktivierung der prädiktiven Optimierung für alle verwalteten Tabellen in Unity Catalog, um die Datenwartung zu vereinfachen und die Speicherkosten zu senken. Siehe Prädiktive Optimierung für verwaltete Unity Catalog-Tabellen.
Mit dem Befehl OPTIMIZE
werden Datendateien neu geschrieben, um das Datenlayout für Delta-Tabellen zu verbessern. Bei Tabellen, für die Liquid Clustering aktiviert ist, schreibt OPTIMIZE
die Datendateien neu, um die Daten nach Liquid Clustering-Schlüsseln zu gruppieren. Bei Tabellen mit definierten Partitionen werden die Dateikomprimierung und das Datenlayout innerhalb der Partitionen durchgeführt.
Tabellen ohne Liquid Clustering können optional eine ZORDER BY
-Klausel enthalten, um das Clustering der Daten beim Umschreiben zu verbessern. Databricks empfiehlt die Verwendung von Liquid Clustering anstelle von Partitionen, ZORDER
oder anderen Datenlayoutansätzen.
Weitere Informationen finden Sie unter OPTIMIZE.
Syntaxbeispiele
Sie lösen die Komprimierung aus, indem Sie den Befehl OPTIMIZE
ausführen:
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()
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 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()
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?
Aktivieren Sie die Predictive Optimization für verwaltete Unity Catalog-Tabellen, um sicherzustellen, dass OPTIMIZE
automatisch ausgeführt wird, wenn es kostengünstig ist.
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.