Freigeben über


Verwenden von Liquid Clustering für Delta-Tabellen

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.

Wichtig

Databricks empfiehlt die Verwendung von Databricks Runtime 15.2 und höher für alle Tabellen mit aktiviertem Liquid Custering. Unterstützung der öffentlichen Vorschau mit Einschränkungen ist in Databricks Runtime 13.3 LTS und höher verfügbar.

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 Clustering für eine vorhandene Tabelle oder während der Tabellenerstellung aktivieren. Clustering ist nicht mit der Partitionierung oder ZORDER kompatibel und erfordert, dass Sie Azure Databricks zur Verwaltung aller Layout- und Optimierungsvorgänge für Daten in Ihrer Tabelle verwenden. Führen Sie nach der Aktivierung von Liquid Clustering OPTIMIZE-Aufträge wie gewohnt 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?.

Mithilfe der folgenden Syntax können Sie die 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.

Sie können bis zu 4 Spalten als Clusteringschlüssel angeben. 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. Weitere Informationen finden Sie unter Angeben von Delta-Statistikspalten.

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

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.

Die folgenden Vorgänge gruppieren Daten beim Schreiben:

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

Strukturierte Streaming-Schreibvorgänge lösen nie Clustering beim Schreiben aus. Es gelten zusätzliche Einschränkungen. Informationen finden Sie unter Einschränkungen.

Das Clustering bei Schreibvorgängen wird nur ausgelöst, wenn Daten in der Transaktion einen Größenschwellenwert erreichen. Diese Schwellenwerte variieren je nach Anzahl der Clusterspalten und sind für verwaltete Unity Catalogtabellen niedriger als andere Delta-Tabellen.

Anzahl der Clusterspalten Schwellenwertgröße für verwaltete Tabellen im Unity Catalog Schwellenwertgröße für andere Delta-Tabellen
1 64 MB 256 MB
2 256 MB 1 GB
3 512 MB 2 GB
4 1 GB 4 GB

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

Die Predictive Optimization führt automatisch OPTIMIZE-Befehle für aktivierte Tabellen aus. Weitere Informationen finden Sie unter Prädiktive Optimierung für Delta Lake.

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

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:

  • In Databricks Runtime 15.1 und darunter unterstützt Clustering beim Schreiben keine Quellabfragen, die Filter, Joins oder Aggregationen enthalten.
  • Strukturierte Streamingworkloads unterstützen Clustering beim Schreiben nicht.
  • Sie können keine Tabelle mit Liquid Clusterung erstellen, die mit einem strukturierten Streaming-Schreibvorgang aktiviert ist. Sie können strukturiertes Streaming verwenden, um Daten in eine vorhandene Tabelle mit aktivierter Liquid Clustering-Funktion zu schreiben.
  • Delta Sharing unterstützt das Freigeben von Tabellen mit aktivierter Liquid Clustering-Funktion nicht.