Freigeben über


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.