Använd flytande klustring för Delta-tabeller
Delta Lake liquid clustering ersätter tabellpartitionering och ZORDER
för att förenkla beslut om datalayout och optimera 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. Flytande klustring gäller för både Streaming Tables och Materialized Views.
Viktigt!
Databricks rekommenderar att du använder Databricks Runtime 15.2 och senare för alla tabeller med flytande klustring aktiverat. Stöd för offentlig förhandsversion med begränsningar är tillgängligt i Databricks Runtime 13.3 LTS och senare.
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, som innehåller både strömningstabeller (ST) och materialiserade vyer (MV). Följande är exempel på scenarier som drar nytta av klustring:
- Tabeller filtreras ofta efter kolumner med hög kardinalitet.
- Tabeller med betydande skevhet i datadistribution.
- Tabeller som växer snabbt och kräver underhåll och justering.
- Tabeller med krav på samtidiga skrivoperationer.
- Tabeller med åtkomstmönster som ändras över tid.
- Tabeller där en typisk partitionsnyckel kan lämna tabellen med för många eller för få partitioner.
Aktivera flytande klustring
Du kan aktivera flytande klustring i en befintlig tabell eller när tabellen skapas. Klustring är inte kompatibelt med partitionering eller ZORDER
och kräver att du använder Azure Databricks för att hantera alla layout- och optimeringsåtgärder för data i tabellen. När klustring av vätskor har aktiverats kör du OPTIMIZE
jobb som vanligt för att gradvis klustra data. Se Så här utlöser du klustring.
Om du vill aktivera flytande klustring lägger du till frasen CLUSTER BY
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) 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 tabeller med liquid clustering aktiverat genom att använda 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
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 funktionskompatibilitet med Delta Lake?.
Du kan aktivera flytande klustring i en befintlig opartitionerad Delta-tabell 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.
Om du vill ta bort klustringsnycklar använder du följande syntax:
ALTER TABLE table_name CLUSTER BY NONE;
Automatisk flytande klustring
Viktigt!
Automatisk flytande klustring finns i offentlig förhandsversion.
I Databricks Runtime 15.4 LTS och senare kan du aktivera automatisk flytande klustring för hanterade Unity Catalog-tabeller. Med automatisk flytande klustring aktiverad väljer Azure Databricks på ett intelligent sätt klustringsnycklar för att optimera frågeprestanda. Du aktiverar automatisk vätskeklustring med hjälp av CLUSTER BY AUTO
-satsen.
När det är aktiverat körs automatiska nyckelval och klustringsåtgärder asynkront som en underhållsåtgärd och kräver att förutsägelseoptimering är aktiverat för tabellen. Se Förutsägelseoptimering för hanterade Unity Catalog-tabeller.
För att identifiera klustringsnycklar analyserar Azure Databricks den historiska frågearbetsbelastningen för tabellen och identifierar de bästa kandidatkolumnerna. Klustringsnycklar ändras när de förväntade kostnadsbesparingarna från förbättringar för datahoppning överväger klustringskostnaden.
Om sättet du använder för att fråga efter dina data förändras över tid eller om frågeprestanda indikerar ändringar i dina datadistributioner, väljer automatisk dynamisk klustring nya nycklar för att optimera dess prestanda.
Kommentar
Du kan läsa eller skriva tabeller med automatisk klustring aktiverad från alla Databricks Runtime-versioner som stöder flytande klustring, men intelligent nyckelval förlitar sig på metadata som introduceras i Databricks Runtime 15.4 LTS. Använd Databricks Runtime 15.4 LTS eller senare för att säkerställa att automatiskt valda nycklar gynnar alla dina arbetsbelastningar och att dessa arbetsbelastningar beaktas när du väljer nya nycklar.
Aktivera eller inaktivera automatisk klustring
Om du vill skapa en ny tabell med automatisk flytande klustring aktiverad använder du följande syntax:
CREATE OR REPLACE TABLE table_name CLUSTER BY AUTO;
Du kan också aktivera automatisk flytande klustring i en befintlig tabell, inklusive tabeller som tidigare hade manuellt angivna nycklar, enligt följande exempel:
ALTER TABLE table_name CLUSTER BY AUTO;
Du kan också ändra tabeller med automatisk flytande klustring aktiverad för att använda manuellt angivna nycklar.
Anteckning
Egenskapen clusterByAuto
är inställd på true
när du aktiverar automatisk flytande klustring.
Egenskapen clusteringColumns
visar de aktuella klustringskolumnerna som valts genom automatisk nyckelval. Kör DESCRIBE EXTENDED table_name
för att se den fullständiga listan med tabellegenskaper.
Å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:
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);
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å radsnivå är inaktiverat, vilket gör transaktioner och klustringsåtgärder mer benägna att komma i konflikt. Se Skrivkonflikter vid radkonkurrens.DELETE , MERGE och 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 påverkan på vätskekluster-beteende. |
Välj klustringsnycklar
Databricks rekommenderar automatisk flytande klustring för tabeller som stöds. Se Automatisk vätskegruppering.
Databricks rekommenderar att du väljer klusternycklar baserat på de kolumner som används oftast i frågefilter. Klustringsnycklar kan definieras i valfri ordning. Om två kolumner är starkt korrelerade behöver du bara inkludera en av dem som en klustringsnyckel.
Du kan ange upp till fyra klustringsnycklar. För mindre tabeller (under 10 TB) kan fler klusternycklar (till exempel fyra) försämra prestanda vid filtrering på en enda kolumn jämfört med att använda färre klusternycklar (till exempel två). Men när tabellstorleken ökar blir prestandaskillnaden med fler klustringsnycklar för frågor med en kolumn försumbar.
Du kan bara ange kolumner som har insamlade statistik som klustringsnycklar. Som standard har de första 32 kolumnerna i en Delta-tabell statistik som samlats in. Se Ange Delta-statistikkolumner.
Klustring stöder följande datatyper för klustringsnycklar:
- Datum
- Tidsstämpel
- TidsstämpelNTZ (kräver Databricks Runtime 14.3 LTS eller senare)
- Sträng
- Integer
- Lång
- Kortfattad
- Flyttal
- Dubbel
- Decimal
- Byte
Om du konverterar en befintlig tabell bör du överväga följande rekommendationer:
Aktuell dataoptimeringsteknik | Rekommendation för klustringsnycklar |
---|---|
Partitionering i Hive-stil | Använd partitionskolumner som klustringsnycklar. |
Z-orderindexering | Använd de ZORDER BY kolumnerna 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 funktioner i Delta-skrivprotokollet som används av liquid clustering. På Azure Databricks måste du använda Databricks Runtime 13.3 LTS och senare.
Operationer som klustrar vid skrivning inkluderar följande:
-
INSERT INTO
åtgärder -
CTAS
- ochRTAS
-satser -
COPY INTO
från Parquet-formatet spark.write.mode("append")
Strukturerade direktuppspelningsskrivningar utlöser aldrig klustring vid skrivning. Ytterligare begränsningar gäller. Se Begränsningar.
Klustring utlöses endast vid skrivning när data i transaktionen uppfyller ett storlekströskelvärde. Dessa tröskelvärden varierar beroende på antalet klustringskolumner och är lägre för hanterade Unity Catalog-tabeller än andra Delta-tabeller.
Antal klustringskolumner | Tröskelvärdesstorlek för hanterade Unity Catalog-tabeller | Tröskelvärdesstorlek för andra Delta-tabeller |
---|---|---|
1 | 64 MB | 256 MB |
2 | 256 MB | 1 GB |
3 | 512 MB | 2 GB |
4 | 1 GB | 4 GB |
Eftersom inte alla operationer använder flytande klustring, rekommenderar Databricks att du ofta kör OPTIMIZE
för att säkerställa att all data är effektivt klustrad.
Så här utlöser du klustring
Förutsägande optimering kör automatiskt OPTIMIZE
kommandon för aktiverade tabeller. Se Förutsägelseoptimering för hanterade Unity Catalog-tabeller.
Om du vill utlösa klustring måste du använda Databricks Runtime 13.3 LTS eller senare. Använd kommandot OPTIMIZE
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 eller varannan timme. Eftersom flytande klustring är inkrementell körs de flesta OPTIMIZE
jobb för klustrade tabeller snabbt.
Framtvinga omgruppering för alla poster
I Databricks Runtime 16.0 och senare kan du tvinga återklustring av alla poster i en tabell med följande syntax:
OPTIMIZE table_name FULL;
Viktigt!
Att köra OPTIMIZE FULL
omfördelar all befintlig data vid behov. För stora tabeller 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 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 grupperad
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
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-tabellfunktioner.
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 lägre versioner kan du inte skapa en tabell med liquid clustering aktiverad med en strukturerad strömmningsskrivning. Du kan använda Structured Streaming för att skriva data till en befintlig tabell med flytande klustring aktiverat.