Använda flytande klustring för Delta-tabeller

Viktigt!

Delta Lake Liquid-klustring är tillgängligt i offentlig förhandsversion i Databricks Runtime 13.3 och senare. Visst stöd för flytande klustring finns i Databricks Runtime 12.2 LTS och senare. Se Kompatibilitet för tabeller med flytande klustring.

Delta Lake liquid clustering ersätter tabellpartitionering och ZORDER förenklar beslut om datalayout och optimerar frågeprestanda. Flytande klustring ger flexibilitet att omdefiniera klustringsnycklar utan att skriva om befintliga data, så att datalayouten kan utvecklas tillsammans med analysbehov över tid.

Varning

Databricks Runtime 13.3 LTS och senare krävs för att skapa, skriva eller OPTIMIZE Delta-tabeller med flytande klustring aktiverat.

Kommentar

Tabeller 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 tabeller 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-tabeller. Följande är exempel på scenarier som drar nytta av klustring:

  • Tabeller som ofta filtreras efter kolumner med hög kardinalitet.
  • Tabeller med betydande dataskevhet i distributionen.
  • Tabeller som växer snabbt och kräver underhåll och finjustering.
  • Tabeller med krav på samtidig skrivning.
  • Tabeller med åtkomstmönster som ändras över tid.
  • Tabeller där en typisk nyckel för partition kan lämna tabellen med för många eller för få partitioner.

Aktivera flytande klustring

Du kan aktivera flytande kluster i en befintlig tabell eller när tabellen skapas. Klustring är inte kompatibelt med partitionering eller ZORDER, och kräver att Azure Databricks-klienten hanterar alla layout- och optimeringsåtgärder för data i tabellen. När du är aktiverad 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 CLUSTER BY frasen i en tabellskapandesats, 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) 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()

Varning

Tabeller som skapats med flytande klustring aktiverat har flera Delta-tabellfunktioner aktiverade när de skapas och använder Delta writer version 7 och läsarversion 3. Du kan åsidosätta aktiveringen av vissa av dessa funktioner. Se Åsidosätt standardfunktionsaktivering (valfritt).

Det går inte att nedgradera tabellprotokollversioner och tabeller med klustring aktiverat kan inte läsas av Delta Lake-klienter som inte stöder alla aktiverade deltaläsarprotokolltabellfunktioner. Se Hur hanterar Azure Databricks Delta Lake-funktionskompatibilitet?.

I Databricks Runtime 13.3 LTS och senare kan du aktivera flytande klustring i en befintlig opartitionerad Delta-tabell med hjälp av följande syntax:

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

Åsidosätt standardfunktionsaktivering (valfritt)

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

  1. Använd ALTER TABLE för att ange den tabellegenskap 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 i tabellen genom att köra följande:

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

Följande tabell innehåller information om deltafunktioner som du kan åsidosätta och hur aktivering 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å kolumner är korrelerade behöver du bara lägga till en av dem som en klustringsnyckel.

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
  • Booleskt

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

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

Skriva data till en klustrad tabell

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

De flesta åtgärder klustrade inte automatiskt data vid skrivning. Åtgärder som klustret vid skrivning innehåller följande:

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

Kommentar

Klustring vid skrivning är ett program som passar bäst och tillämpas inte i följande situationer:

  • Om en skrivåtgärd överskrider 512 GB data.
  • SELECT Om underfrågan innehåller en transformering, ett filter eller en koppling.
  • Om beräknade kolumner inte är samma som källtabellen.

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

Om du vill utlösa klustring måste du använda Databricks Runtime 13.3 LTS eller senare. OPTIMIZE Använd kommandot i tabellen, 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 tabeller som har många uppdateringar eller infogningar rekommenderar Databricks schemaläggning av ett OPTIMIZE jobb var en eller två timmar. Eftersom flytande klustring är inkrementell körs de flesta OPTIMIZE jobb för klustrade tabeller snabbt.

Läsa data från en klustrad tabell

Du kan läsa data i en klustrad tabell med hjälp av alla Delta Lake-klienter som stöder läsning av borttagningsvektorer. 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 tabell 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 tabellen är klustrad

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

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

Kompatibilitet för tabeller med flytande klustring

Databricks rekommenderar att du använder Databricks Runtime 13.3 LTS eller senare för alla arbetsbelastningar som läser eller skriver från tabeller med flytande klustring aktiverat.

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

Du kan inaktivera v2-kontrollpunkter och nedgradera tabellprotokoll till att läsa tabeller med flytande klustring i Databricks Runtime 12.2 LTS och senare. Se Drop Delta table features (Ta bort deltatabellfunktioner).

Begränsningar

Följande begränsningar finns:

  • Du kan bara ange kolumner med statistik som samlas in för klustringsnycklar. Som standard har de första 32 kolumnerna i en Delta-tabell statistik som samlas in.
  • Du kan ange upp till 4 kolumner som klustringsnycklar.
  • Strukturerade strömningsarbetsbelastningar stöder inte klustring vid skrivning.