Dela via


Använd flytande klustring för Delta tables

Delta Lake liquid clustering ersätter table partitionering och ZORDER, vilket förenklar beslutsprocessen rörande datalayout och förbättrar optimize förfrågningsprestanda. Flytande klustring ger flexibilitet att omdefiniera klustringsnycklar utan att skriva om befintliga data, så att datalayouten kan utvecklas tillsammans med analysbehov över tid.

Viktigt!

Databricks rekommenderar att använda Databricks Runtime 15.2 eller senare för alla tables där flytande klustrering är aktiverad. Stöd för offentlig förhandsversion med begränsningar är tillgängligt i Databricks Runtime 13.3 LTS och senare.

Kommentar

Tables med flytande klustring aktiverat stöder samtidighet på radnivå i Databricks Runtime 13.3 LTS och senare. Samtidighet på radnivå är allmänt tillgängligt i Databricks Runtime 14.2 och senare för alla tables med borttagningsvektorer aktiverade. Se Isoleringsnivåer och skrivkonflikter i Azure Databricks.

Vad används flytande klustring till?

Databricks rekommenderar flytande klustring för alla nya Delta tables. Följande är exempel på scenarier som drar nytta av klustring:

  • Tables filtreras ofta efter hög kardinalitet columns.
  • Tables med betydande skevhet i datadistributionen.
  • Tables som växer snabbt och kräver underhåll och justeringsinsats.
  • Tables med samtidiga skrivkrav.
  • Tables med åtkomstmönster som ändras över tid.
  • Tables where en typisk partition nyckel kan lämna table med för många eller för få partitioner.

Aktivera flytande klustring

Du kan aktivera flytande klustring på en befintlig table eller när table skapas. Klustring är inte kompatibelt med partitionering eller ZORDERoch kräver att du använder Azure Databricks för att hantera alla layout- och optimeringsåtgärder för data i table. När flytande klustring har aktiverats kör du OPTIMIZE jobb som vanligt för att stegvis klustra data. Se Så här utlöser du klustring.

Om du vill aktivera flytande klustring lägger du till frasen CLUSTER BY i skapandeinstruktionen table, som i exemplen nedan:

Kommentar

I Databricks Runtime 14.2 och senare kan du använda DataFrame-API:er och DeltaTable API i Python eller Scala för att aktivera flytande klustring.

SQL

-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) 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.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.clusterBy("col0").saveAsTable("table2")

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

I Databricks Runtime 16.0 och senare kan du skapa tables med Liquid Clustering aktiverat genom Structured Streaming-skrivningar, som i följande exempel:

Python

(spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")
)

Scala

spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")

Varning

Tables som skapats med flytande klustring aktiverat har många Delta table-funktioner aktiverade vid skapande och använder Delta-skrivare version 7 och läsare version 3. Du kan åsidosätta aktiveringen av vissa av dessa funktioner. Se Åsidosätt standardfunktionsaktivering (valfritt).

Table protokollversioner kan inte nedgraderas och tables med klustring aktiverat kan inte läsas av Delta Lake-klienter som inte stöder alla aktiverade Delta-läsarprotokoll table funktioner. Se Hur hanterar Azure Databricks funktionskompatibilitet med Delta Lake?.

Du kan aktivera flytande klustring på en befintlig icke-partitionerad Delta-table med hjälp av följande syntax:

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

Viktigt!

Standardbeteendet gäller inte klustring för tidigare skrivna data. Om du vill framtvinga omklustrering för alla poster måste du använda OPTIMIZE FULL. Se Tvingad omklustring för alla poster.

Åsidosätt standardfunktionsaktivering (valfritt)

Du kan åsidosätta standardbeteende som aktiverar Delta table-funktioner under aktivering av flytande klustring. Detta förhindrar att läsar- och skrivprotokoll som är associerade med de table funktionerna uppgraderas. Du måste ha en befintlig table för att slutföra följande steg:

  1. Använd ALTER TABLE till set egenskapen table som inaktiverar en eller flera funktioner. Om du till exempel vill inaktivera borttagningsvektorer kör du följande:

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. Aktivera flytande klustring på table genom att köra följande:

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

Följande table innehåller information om Delta-funktioner som du kan åsidosätta och hur möjliggörandet påverkar kompatibiliteten med Databricks Runtime-versioner.

Delta-funktion Körningskompatibilitet Egenskap för att åsidosätta aktivering Påverkan av inaktivering på flytande klustring
Borttagningsvektorer Läsningar och skrivningar kräver Databricks Runtime 12.2 lTS och senare. 'delta.enableDeletionVectors' = false Samtidighet på radnivå är inaktiverat, vilket gör transaktioner och klustringsåtgärder mer benägna att vara i konflikt. Se Skriva konflikter med samtidighet på radnivå.

DELETE, MERGEoch UPDATE kommandon kan köras långsammare.
Radspårning Skrivningar kräver Databricks Runtime 13.3 LTS och senare. Kan läsas från valfri Databricks Runtime-version. 'delta.enableRowTracking' = false Samtidighet på radnivå är inaktiverat, vilket gör transaktioner och klustringsåtgärder mer benägna att vara i konflikt. Se Skriva konflikter med samtidighet på radnivå.
Kontrollpunkter V2 Läsningar och skrivningar kräver Databricks Runtime 13.3 LTS och senare. 'delta.checkpointPolicy' = 'classic' Ingen inverkan på beteendet för flytande klustring.

Välj klustringsnycklar

Databricks rekommenderar att du väljer klusternycklar baserat på vanliga frågefilter. Klustringsnycklar kan definieras i valfri ordning. Om två columns är korrelerade behöver du bara lägga till en av dem som en klustringsnyckel.

Du kan ange upp till 4 columns som klustringsnycklar. Du kan bara ange columns med statistik som samlats in för klustringsnycklar. Som standard har de första 32 columns i en Delta-table statistik insamlad. Se Ange deltastatistik columns.

Klustring stöder följande datatyper för klustringsnycklar:

  • Datum
  • Tidsstämpel
  • TidsstämpelNTZ (kräver Databricks Runtime 14.3 LTS eller senare)
  • String
  • Integer
  • Long
  • Kort
  • Flyttal
  • Dubbel
  • Decimal
  • Byte

Om du konverterar en befintlig tablebör du överväga följande rekommendationer:

Aktuell dataoptimeringsteknik Rekommendation för klustringsnycklar
Hive-format partitionering Använd partitioncolumns som klustringsnycklar.
Z-orderindexering Använd ZORDER BYcolumns som klustringsnycklar.
Partitionering i Hive-stil och Z-ordning Använd både partitioncolumns och ZORDER BYcolumns som klustringsnycklar.
Genererade columns för att minska kardinaliteten (till exempel datum för en tidsstämpel) Använd den ursprungliga column som en klustringsnyckel och skapa inte en genererad column.

Skriva data till en klustrad table

Du måste använda en Delta-skrivarklient som stöder alla Delta-skrivprotokoll table funktioner som används av flytande klustring. På Azure Databricks måste du använda Databricks Runtime 13.3 LTS och senare.

Åtgärder som klustret vid skrivning innehåller följande:

  • INSERT INTO åtgärder
  • CTAS och RTAS -instruktioner
  • COPY INTO från Parquet-format
  • spark.write.mode("append")

Strukturerade direktuppspelningsskrivningar utlöser aldrig klustring vid skrivning. Ytterligare begränsningar gäller. Se Begränsningar.

Klustring vid skrivutlösare endast när data i transaktionen uppfyller ett storlekströskelvärde. Dessa tröskelvärden varierar beroende på antalet kluster columns och är lägre för Unity Catalog hanterade tables än andra Delta tables.

Antal klustringar columns Tröskelvärde för Unity Catalog hanterad tables Tröskelvärdesstorlek för andra Delta-tables
1 64 MB 256 MB
2 256 MB 1 GB
3 512 MB 2 GB
4 1 GB 4 GB

Eftersom inte alla åtgärder tillämpar flytande klustring rekommenderar Databricks att du kör OPTIMIZE ofta för att säkerställa att alla data är effektivt klustrade.

Så här utlöser du klustring

Förutsägande optimering kör automatiskt OPTIMIZE kommandon för aktiverade tables. Se Förutsägelseoptimering för Unity Catalog hanterad tables.

Om du vill utlösa klustring måste du använda Databricks Runtime 13.3 LTS eller senare. Använd kommandot OPTIMIZE på din table, som i följande exempel:

OPTIMIZE table_name;

Flytande klustring är inkrementell, vilket innebär att data endast skrivs om efter behov för att hantera data som behöver grupperas. Datafiler med klustringsnycklar som inte matchar data som ska grupperas skrivs inte om.

För bästa prestanda rekommenderar Databricks schemaläggning av vanliga OPTIMIZE jobb till klusterdata. För tables som upplever många uppdateringar eller infogningar rekommenderar Databricks att du schemalägger ett OPTIMIZE-jobb varje eller varannan timme. Eftersom flytande klustring är inkrementell körs de flesta OPTIMIZE jobb för klustrade tables snabbt.

Framtvinga omgruppering för alla poster

I Databricks Runtime 16.0 och senare kan du tvinga fram omklustring av alla poster i en table med följande syntax:

OPTIMIZE table_name FULL;

Viktigt!

Att köra OPTIMIZE FULL omfördelar all befintlig data vid behov. För stora tables som inte tidigare har grupperats på de angivna nycklarna kan den här åtgärden ta timmar.

Kör OPTIMIZE FULL när du aktiverar klustring för första gången eller ändrar klustringsnycklar. Om du tidigare har kört OPTIMIZE FULL och det inte har skett någon ändring i klustringsnycklar, kör OPTIMIZE FULL samma som OPTIMIZE. Använd alltid OPTIMIZE FULL för att säkerställa att datalayouten återspeglar de aktuella klustringsnycklarna.

Läsa data från en klustrad table

Du kan läsa data i en klustrad table med hjälp av alla Delta Lake-klienter som stöder läsning av raderingsvektorer. För bästa frågeresultat inkluderar du klustringsnycklar i dina frågefilter, som i följande exempel:

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

Ändra klustringsnycklar

Du kan ändra klustringsnycklar för en table när som helst genom att köra ett ALTER TABLE kommando, som i följande exempel:

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

När du ändrar klustringsnycklar använder efterföljande OPTIMIZE åtgärder och skrivåtgärder den nya klustringsmetoden, men befintliga data skrivs inte om.

Du kan också inaktivera klustring genom att ställa in nycklarna på NONE, som i följande exempel:

ALTER TABLE table_name CLUSTER BY NONE;

Om du ställer in klusternycklar på NONE skrivs inte data som redan har klustrats om, men framtida OPTIMIZE åtgärder hindras från att använda klustringsnycklar.

Se hur table är grupperad

Du kan använda DESCRIBE-kommandon för att se klustringsnycklarna för en table, som i följande exempel:

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

Kompatibilitet för tables med vätskeklustring

Tables som skapats med flytande klustring i Databricks Runtime 14.1 och senare använder v2-kontrollpunkter som standard. Du kan läsa och skriva tables med v2-kontrollpunkter i Databricks Runtime 13.3 LTS och senare.

Du kan inaktivera v2-kontrollpunkter och nedgradera table-protokoll för att läsa tables med liquid clustering i Databricks Runtime 12.2 LTS och senare. Se Drop Delta table funktioner hos.

Begränsningar

Följande begränsningar finns:

  • I Databricks Runtime 15.1 och nedan stöder klustring vid skrivning inte källfrågor som innehåller filter, kopplingar eller aggregeringar.
  • Strukturerade strömningsarbetsbelastningar stöder inte klustring vid skrivning.
  • I Databricks Runtime 15.4 LTS och tidigare kan du inte skapa en table med vätskeklustring aktiverad med en skrivning för strukturerad streaming. Du kan använda Structured Streaming för att skriva data till en befintlig table med flytande klustring aktiverat.