Verwenden von Liquid Clustering für Delta-Tabellen

Wichtig

Delta Lake Liquid Clustering ist in der Public Preview in Databricks Runtime 13.3 und höher verfügbar. In Databricks Runtime 12.2 LTS und höher gibt es etwas Unterstützung für Liquid Clustering. Siehe Kompatibilität für Tabellen mit Liquid Clustering.

Delta Lake Liquid Clustering ersetzt Tabellenpartitionierung und ZORDER, um Entscheidungen zum Datenlayout zu vereinfachen und die Abfrageleistung zu optimieren. Liquid Clustering bietet Flexibilität, Clusteringschlüssel neu zu definieren, ohne vorhandene Daten neu zu schreiben, sodass sich das Datenlayout im Laufe der Zeit zusammen mit den Analyseanforderungen weiterentwickeln kann.

Warnung

Databricks Runtime 13.3 LTS und höher ist erforderlich, um Delta-Tabellen mit aktiviertem Liquid Clustering zu erstellen, zu schreiben oder mit OPTIMIZE zu bearbeiten.

Hinweis

Tabellen mit aktiviertem Liquid Clustering unterstützen die Parallelität auf Zeilenebene in Databricks Runtime 13.3 LTS und höher. Die Parallelität auf Zeilenebene ist in Databricks Runtime 14.2 und höher für alle Tabellen mit aktivierten Löschvektoren allgemein verfügbar. Siehe Isolationsstufen und Schreibkonflikte in Azure Databricks.

Wofür wird Liquid Clustering verwendet?

Databricks empfiehlt Liquid Clustering für alle neuen Delta-Tabellen. Im Folgenden sind Beispiele von Szenarien aufgeführt, die von Clustering profitieren:

  • Tabellen werden häufig nach Spalten mit hoher Kardinalität gefiltert.
  • Tabellen mit erheblicher Schiefe in der Datenverteilung.
  • Tabellen, die schnell wachsen und Wartungs- und Optimierungsaufwand erfordern.
  • Tabellen mit gleichzeitigen Schreibanforderungen.
  • Tabellen mit Zugriffsmustern, die sich im Laufe der Zeit ändern.
  • Tabellen, in denen ein typischer Partitionsschlüssel die Tabelle mit zu vielen oder zu wenigen Partitionen hinterlassen könnte.

Aktivieren von Liquid Clustering

Sie können Liquid Cluster auf einer vorhandenen Tabelle oder während der Tabellenerstellung aktivieren. Clustering ist nicht mit der Partitionierung oder ZORDER kompatibel und erfordert, dass der Azure Databricks-Client alle Layout- und Optimierungsvorgänge für Daten in Ihrer Tabelle verwaltet. Führen Sie nach der Aktivierung OPTIMIZE-Aufträge normal aus, um Daten inkrementell zu clustern. Weitere Informationen finden Sie unter Auslösen von Clustering.

Um Liquid Clustering zu aktivieren, fügen Sie den CLUSTER BY-Ausdruck wie in den folgenden Beispielen zu einer Anweisung zur Tabellenerstellung hinzu:

Hinweis

In Databricks Runtime 14.2 und höher können Sie DataFrame-APIs und DeltaTable-API in Python oder Scala verwenden, um Liquid Clustering zu ermöglichen.

SQL

-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) USING DELTA CLUSTER BY (col0);

-- Using a CTAS statement
CREATE EXTERNAL TABLE table2 CLUSTER BY (col0)  -- specify clustering after table name, not in subquery
LOCATION 'table_location'
AS SELECT * FROM table1;

-- Using a LIKE statement to copy configurations
CREATE TABLE table3 LIKE table1;

Python

# Create an empty table
(DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute())

# Using a CTAS statement
df = spark.read.table("table1")
df.write.format("delta").clusterBy("col0").saveAsTable("table2")

# CTAS using DataFrameWriterV2
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Scala

// Create an empty table
DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute()

// Using a CTAS statement
val df = spark.read.table("table1")
df.write.format("delta").clusterBy("col0").saveAsTable("table2")

// CTAS using DataFrameWriterV2
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Warnung

Bei Tabellen, die mit aktiviertem Liquid Clustering erstellt werden, sind bei der Erstellung zahlreiche Delta-Tabellenfunktionen aktiviert, und sie verwenden Writerversion 7 und Readerversion 3 von Delta. Sie können die Aktivierung einiger dieser Features außer Kraft setzen. Siehe Außerkraftsetzen der Standardmäßigen Featureaktivierung (optional).

Tabellenprotokollversionen können nicht herabgestuft werden, und Tabellen mit aktiviertem Clustering können von Delta Lake-Clients, die nicht alle aktivierten Protokolltabellenfunktionen des Delta-Readers unterstützen, nicht gelesen werden. Siehe Wie verwaltet Azure Databricks die Kompatibilität von Delta Lake-Features?.

In Databricks Runtime 13.3 LTS und höher können Sie mithilfe der folgenden Syntax das Liquid Clustering für eine vorhandene nicht partitionierte Delta-Tabelle aktivieren:

ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)

Außerkraftsetzen der Standardmäßigen Featureaktivierung (optional)

Sie können das Standardverhalten außer Kraft setzen, das Delta-Tabellenfeatures während der Aktivierung von Liquid Clustering ermöglicht. Dadurch wird verhindert, dass die Lese- und Schreib-Protokolle, die diesen Tabellenfeatures zugeordnet sind, aktualisiert werden. Sie müssen über eine vorhandene Tabelle verfügen, um die folgenden Schritte auszuführen:

  1. Nutzen Sie ALTER TABLE zum Festlegen der Tabelleneigenschaft, die mindestens ein Feature deaktiviert. Führen Sie z. B. zum Deaktivieren von Löschvektoren Folgendes aus:

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. Aktivieren Sie Liquid Clustering auf der Tabelle, indem Sie Folgendes ausführen:

    ALTER TABLE <table_name>
    CLUSTER BY (<clustering_columns>)
    

Die folgende Tabelle enthält Informationen zu den Delta-Features, die Sie außer Kraft setzen können und wie sich die Aktivierung auf die Kompatibilität mit Databricks-Runtime-Versionen auswirkt.

Delta-Funktion Laufzeitkompatibilität Eigenschaft zum Außerkraftsetzen der Aktivierung Auswirkungen der Deaktivierung auf Liquid Clustering
Löschvektoren Lese- und Schreibvorgänge erfordern Databricks Runtime 12.2 LTS und höher. 'delta.enableDeletionVectors' = false Die Parallelität auf Zeilenebene ist deaktiviert, wodurch Transaktionen und Clusteringvorgänge wahrscheinlicher in Konflikt stehen. Weitere Informationen finden Sie unter Schreibkonflikte mit Parallelität auf Zeilenebene.

DELETE, MERGE und UPDATE Befehle werden vielleicht langsamer ausgeführt.
Zeilenverfolgung Schreibvorgänge erfordern Databricks Runtime 13.3 LTS und höher. Kann aus jeder Databricks-Runtime-Version gelesen werden. 'delta.enableRowTracking' = false Die Parallelität auf Zeilenebene ist deaktiviert, wodurch Transaktionen und Clusteringvorgänge wahrscheinlicher in Konflikt stehen. Weitere Informationen finden Sie unter Schreibkonflikte mit Parallelität auf Zeilenebene.
V2-Prüfpunkte Lese- und Schreibvorgänge erfordern Databricks Runtime 13.3 LTS und höher. 'delta.checkpointPolicy' = 'classic' Keine Auswirkungen auf das Liquid Clustering-Verhalten.

Auswählen von Clusteringschlüssel

Databricks empfiehlt die Auswahl von Clusteringschlüsseln basierend auf häufig verwendeten Abfragefiltern. Clusteringschlüssel können in beliebiger Reihenfolge definiert werden. Wenn zwei Spalten korrelieren, müssen Sie nur eine davon als Clusteringschlüssel hinzufügen.

Clustering unterstützt die folgenden Datentypen für Clusteringschlüssel:

  • Datum
  • Timestamp
  • TimestampNTZ (benötigt Databricks Runtime 14.3 LTS oder höher)
  • String
  • Ganzzahl
  • Lang
  • Short
  • Gleitkomma
  • Double
  • Decimal
  • Byte
  • Boolean

Wenn Sie eine vorhandene Tabelle konvertieren, berücksichtigen Sie die folgenden Empfehlungen:

Aktuelle Datenoptimierungstechnik Empfehlung für Clusteringschlüssel
Partitionierung im Hive-Stil Verwenden Sie Partitionsspalten als Clusteringschlüssel.
Indizierung nach Z-Reihenfolge Verwenden Sie ZORDER BY-Spalten als Clusteringschlüssel.
Partitionierung im Hive-Stil und Z-Reihenfolge Verwenden Sie sowohl Partitionsspalten als auch ZORDER BY-Spalten als Clusteringschlüssel.
Generierte Spalten zur Verringerung der Kardinalität (z. B. Datum für einen Zeitstempel) Verwenden Sie die ursprüngliche Spalte als Clusteringschlüssel, und erstellen Sie keine generierte Spalte.

Schreiben von Daten in eine gruppierte Tabelle

Sie müssen einen Delta-Writerclient verwenden, der alle von Liquid Clustering verwendeten Tabellenfunktionen des Delta-Schreibprotokolls unterstützt. In Azure Databricks müssen Sie Databricks Runtime 13.3 LTS und höher verwenden.

Bei den meisten Vorgängen werden Daten beim Schreiben nicht automatisch gruppiert. Die folgenden Vorgänge gruppieren Daten beim Schreiben:

  • INSERT INTO-Vorgänge
  • CTAS-Anweisungen
  • COPY INTO aus dem Parquet-Format
  • spark.write.format("delta").mode("append")

Hinweis

Das Clustering bei Schreibvorgängen ist eine Best-Effort-Anwendung und wird in folgenden Situationen nicht angewendet:

  • Ein Schreibvorgang überschreitet eine Datenmenge von 512 GB.
  • Die Unterabfrage SELECT enthält eine Transformation, einen Filter oder eine Verknüpfung.
  • Projizierte Spalten stimmen nicht mit der Quelltabelle überein.

Da nicht alle Vorgänge Liquid Clustering anwenden, empfiehlt Databricks, OPTIMIZE häufig auszuführen, um sicherzustellen, dass das Clustering für alle Daten effizient erfolgt.

Auslösen von Clustering

Zum Auslösen des Clusterings müssen Sie Databricks Runtime 13.3 LTS oder höher verwenden. Verwenden Sie den OPTIMIZE-Befehl für Ihre Tabelle, wie im folgenden Beispiel gezeigt:

OPTIMIZE table_name;

Liquid Clustering ist inkrementell, was bedeutet, dass Daten nur bei Bedarf neu geschrieben werden, um die zu gruppierenden Daten aufzunehmen. Datendateien mit Clusteringschlüsseln, die nicht mit den zu gruppierenden Daten übereinstimmen, werden nicht neu geschrieben.

Um eine optimale Leistung zu erzielen, empfiehlt Databricks, regelmäßige OPTIMIZE-Aufträge für Clusterdaten zu planen. Für Tabellen mit vielen Updates oder Einfügungen empfiehlt Databricks, alle ein bis zwei Stunden einen OPTIMIZE-Auftrag zu planen. Da Liquid Clustering inkrementell ist, werden die meisten OPTIMIZE-Aufträge für gruppierte Tabellen schnell ausgeführt.

Lesen von Daten aus einer gruppierten Tabelle

Sie können Daten in einer gruppierten Tabelle mit einem beliebigen Delta Lake-Client lesen, der das Lesen von Löschvektoren unterstützt. Um optimale Abfrageergebnisse zu erzielen, schließen Sie Clusteringschlüssel in Ihre Abfragefilter ein, wie im folgenden Beispiel gezeigt:

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

Ändern von Clusteringschlüsseln

Sie können Clusteringschlüssel für eine Tabelle jederzeit ändern, indem Sie einen ALTER TABLE-Befehl ausführen, wie im folgenden Beispiel gezeigt:

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

Wenn Sie Clusteringschlüssel ändern, verwenden nachfolgende OPTIMIZE- und Schreibvorgänge den neuen Clusteringansatz, vorhandene Daten werden jedoch nicht neu geschrieben.

Sie können das Clustering auch deaktivieren, indem Sie die Schlüssel wie im folgenden Beispiel auf NONE festlegen:

ALTER TABLE table_name CLUSTER BY NONE;

Wenn Sie Clusteringschlüssel auf NONE festlegen, werden bereits gruppierte Daten nicht neu geschrieben, aber zukünftige OPTIMIZE-Vorgänge werden daran gehindert, Clusteringschlüssel zu verwenden.

Anzeigen, wie eine Tabelle gruppiert ist

Mithilfe von DESCRIBE-Befehlen können Sie die Clusteringschlüssel für eine Tabelle anzeigen, wie in den folgenden Beispielen gezeigt:

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

Kompatibilität für Tabellen mit Liquid Clustering

Databricks empfiehlt die Verwendung von Databricks Runtime 13.3 LTS oder höher für alle Workloads, die aus Tabellen mit aktivierter Liquid Clustering lesen oder schreiben.

Tabellen, die mit Liquid Clustering in Databricks Runtime 14.1 und höher erstellt wurden, verwenden standardmäßig v2-Prüfpunkte. Sie können Tabellen mit v2-Prüfpunkten in Databricks Runtime 13.3 LTS und höher lesen und schreiben.

Sie können v2-Prüfpunkte deaktivieren und Tabellenprotokolle herabstufen, um Tabellen mit Liquid Clustering in Databricks Runtime 12.2 LTS und höher zu lesen. Siehe Delta-Tabellenfeatures ablegen.

Begrenzungen

Es gelten die folgenden Einschränkungen:

  • Sie können nur Spalten angeben, deren Statistiken für Clusteringschlüssel erfasst wurden. Standardmäßig werden für die ersten 32 Spalten in einer Delta-Tabelle Statistiken erfasst.
  • Sie können bis zu 4 Spalten als Clusteringschlüssel angeben.
  • Strukturierte Streamingworkloads unterstützen Clustering beim Schreiben nicht.