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 ZORDER
och 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:
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);
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 , 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 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 BY columns som klustringsnycklar. |
Partitionering i Hive-stil och Z-ordning | Använd både partitioncolumns och ZORDER BY columns 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
ochRTAS
-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.