Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Flytande klustring är en optimeringsteknik för datalayout som ersätter tabellpartitionering och ZORDER. Det förenklar tabellhanteringen och optimerar frågeprestanda genom att automatiskt organisera data baserat på klustringsnycklar.
Till skillnad från traditionell partitionering kan du omdefiniera klustringsnycklar utan att skriva om befintliga data. Detta gör att din datalayout kan utvecklas tillsammans med föränderliga analysbehov. Flytande klustring gäller för både strömmande tabeller och materialiserade vyer.
Important
Flytande klustring är allmänt tillgängligt för Delta Lake-tabeller och i offentlig förhandsversion för hanterade Apache Iceberg-tabeller. För Delta Lake-tabeller är GA-stöd tillgängligt med Databricks Runtime 15.2 och senare. Databricks rekommenderar att du använder den senaste Databricks Runtime för bästa prestanda. För Apache Iceberg-tabeller krävs Databricks Runtime 16.4 LTS och senare.
När du ska använda flytande klustring
Databricks rekommenderar flytande klustring för alla nya tabeller, inklusive strömmande tabeller och materialiserade vyer. Följande scenarier drar särskilt nytta av klustring:
- Tabeller som ofta filtreras efter kolumner med hög kardinalitet.
- Tabeller som har skeva i datadistribution.
- Tabeller som växer snabbt och kräver underhåll och justering.
- Tabeller som har samtidiga skrivkrav.
- Tabeller som har å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 opartitionerad tabell eller när tabellen skapas. Klustring är inte kompatibelt med partitionering eller ZORDER. Databricks rekommenderar att plattformen kan hantera alla layout- och optimeringsåtgärder för data i tabellen. När du har aktiverat flytande klustrering, kör OPTIMIZE uppgifter för att stegvis klustra data. Se Så här utlöser du klustring.
Skapa tabeller med klustring
Om du vill aktivera flytande klustring lägger du till CLUSTER BY frasen i en tabellskapandesats, som i exemplen nedan. 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 för Delta Lake-tabeller.
SQL
-- Create an empty Delta table with clustering on col0
CREATE TABLE table1(col0 INT, col1 string) CLUSTER BY (col0);
-- Create table from existing data with clustering
-- Note: CLUSTER BY must appear after table name, not in SELECT clause
CREATE TABLE table2 CLUSTER BY (col0)
AS SELECT * FROM table1;
-- Copy table structure including clustering configuration
CREATE TABLE table3 LIKE table1;
Python
# Create an empty Delta table with clustering on col0
(DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0") # Single clustering key
.execute())
# Create clustered table from existing DataFrame
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
# Alternative: DataFrameWriterV2 API (DBR 14.2+)
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Scala
// Create an empty Delta table with clustering on col0
DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute()
// Create clustered table from existing DataFrame
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
// Alternative: DataFrameWriterV2 API (DBR 14.2+)
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 flytande klustring aktiverat med hjälp av strukturerade direktuppspelningsskrivningar. Databricks rekommenderar att du använder Databricks Runtime 16.4 och senare för bästa prestanda, som i följande exempel:
SQL
CREATE TABLE table1 (
col0 STRING,
col1 DATE,
col2 BIGINT
)
CLUSTER BY (col0, col1);
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")
Warning
Deltatabeller med aktiverad flytande klustring använder Delta writer version 7 och reader version 3. Deltaklienter som inte stöder dessa protokoll kan inte läsa dessa tabeller. Du kan inte nedgradera tabellprotokollversioner. Se Delta Lake-funktionskompatibilitet och protokoll.
Om du vill åsidosätta standardfunktionsaktivering (till exempel borttagningsvektorer), se Åsidosätt standardfunktionsaktivering (valfritt).
Aktivera i befintliga tabeller
Aktivera flytande klustring i en befintlig opartitionerad Delta-tabell med hjälp av följande syntax:
-- Alter an existing table
ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)
För Apache Iceberg måste du uttryckligen inaktivera borttagningsvektorer och rad-ID när du aktiverar flytande klustring på en befintlig hanterad isbergstabell.
Note
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 Framtvinga omklustrering för alla poster.
Ta bort klustringsnycklar
Om du vill ta bort klustringsnycklar använder du följande syntax:
ALTER TABLE table_name CLUSTER BY NONE;
Välj klustringsnycklar
Tips/Råd
Databricks rekommenderar att du använder automatisk flytande klustring för tabeller som stöds, vilket intelligent väljer klustringsnycklar baserat på dina frågemönster. Se Automatisk flytande klustring.
Riktlinjer för nyckelval
När du anger klustringsnycklar manuellt väljer du kolumner baserat på de kolumner som används oftast i frågefilter. Du kan definiera klustringsnycklar 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 klustringsnycklar försämra prestanda vid filtrering på en enda kolumn. Filtrering med fyra nycklar presterar till exempel sämre än filtrering med två nycklar. Men när tabellstorleken ökar blir den här prestandaskillnaden försumbar för frågor med en kolumn.
Klustringsnycklar måste vara kolumner som har insamlad statistik. Som standard har de första 32 kolumnerna i en Delta-tabell statistik som samlats in. Se Ange Deltastatistikkolumner.
Datatyper som stöds
Klustring stöder dessa datatyper för klustringsnycklar:
- Date
- Timestamp
- TidsstämpelNTZ (Databricks Runtime 14.3 LTS och senare)
- String
- Heltal, Lång, Kort, Byte
- Flyttal, dubbel, decimal
Migrera från partitionering eller Z-ordning
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 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. |
Automatisk flytande klustring
I Databricks Runtime 15.4 LTS och senare kan du aktivera automatisk flytande klustring för Hanterade Delta-tabeller i Unity Catalog. Med automatisk klustring baserad på flytande logik kan Azure Databricks intelligenta välja klustringsnycklar för att optimera frågeprestanda med hjälp av CLUSTER BY AUTO-satsen.
Så här fungerar automatisk flytande klustring
Automatisk flytande klustring ger intelligent optimering baserat på dina användningsmönster:
- Kräver förutsägande optimering: Automatiska nyckelval och klustringsåtgärder körs asynkront som en underhållsåtgärd. Se Förutsägande optimering för hanterade Unity Catalog-tabeller.
- Analyserar frågearbetsbelastning: Azure Databricks analyserar tabellens historiska frågearbetsbelastning och identifierar de bästa kandidatkolumnerna för klustring.
- Anpassar sig till ändringar: Om dina frågemönster eller datadistributioner ändras över tid väljer automatisk flytande klustring nya nycklar för att optimera prestanda.
- Kostnadsmedvetet urval: Azure Databricks ändrar bara klustringsnycklar när de förväntade kostnadsbesparingarna från förbättrad dataskipping uppväger kostnaden för datafördelning.
Automatisk flytande klustring kanske inte väljer nycklar av följande skäl:
- Tabellen är för liten för att dra nytta av vätskeformig klustring.
- Tabellen har redan ett effektivt klustringsschema, antingen från tidigare manuella nycklar eller naturlig infogningsordning som matchar frågemönster.
- Tabellen har inte frekventa frågor.
- Du använder inte Databricks Runtime 15.4 LTS eller senare.
Du kan använda automatisk flytande klustring för alla hanterade Unity Catalog-tabeller, oavsett data- och frågeegenskaper. Heuristiken avgör om det är kostnadseffektivt att välja klustringsnycklar.
DBR-versionskompatibilitet
Du kan läsa eller skriva tabeller med automatisk klustring aktiverad från alla Databricks Runtime-versioner som stöder flytande klustring. Intelligent nyckelval förlitar sig dock 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 flytande klustring
Om du vill aktivera eller inaktivera automatisk flytande klustring i en ny eller befintlig tabell använder du följande syntax:
SQL
-- Create an empty table.
CREATE OR REPLACE TABLE table1(column01 int, column02 string) CLUSTER BY AUTO;
-- Enable automatic liquid clustering on an existing table,
-- including tables that previously had manually specified keys.
ALTER TABLE table1 CLUSTER BY AUTO;
-- Disable automatic liquid clustering on an existing table.
ALTER TABLE table1 CLUSTER BY NONE;
-- Disable automatic liquid clustering by setting the clustering keys
-- to chosen clustering columns or new columns.
ALTER TABLE table1 CLUSTER BY (column01, column02);
Om du kör CREATE OR REPLACE table_name utan att CLUSTER BY AUTO ange och tabellen redan finns och har automatisk flytande klustring aktiverad inaktiveras AUTO inställningen och klustringskolumner bevaras inte. Om du vill bevara automatisk flytande klustring och eventuella tidigare valda klustringskolumner tar du med CLUSTER BY AUTO i replace-instruktionen. När den bevaras underhåller förutsägelseoptimering den historiska frågearbetsbelastningen för tabellen för att identifiera de bästa klustringsnycklarna.
Python
df = spark.read.table("table1")
df.write
.format("delta")
.option(“clusterByAuto”, “true”)
.saveAsTable(...)
# Set clustering columns and auto to provide a hint for initial selection
df.write
.format("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option("clusterByAuto", "true")
.saveAsTable(...)
# Using DataFrameWriterV2
df.writeTo(...).using("delta")
.option("clusterByAuto", "true")
.create()
# Set clustering columns and auto to provide a hint for initial selection
df.writeTo(...).using("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option("clusterByAuto", "true")
.create()
# Set clusterByAuto for streaming tables
spark.readStream.table("source_table")
.writeStream
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
# Specify a hint for clustering columns with both auto and columns
spark.readStream.table("source_table")
.writeStream
.clusterBy("column1", "column2")
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
Python-API:et är tillgängligt i Databricks Runtime 16.4 och senare. När du använder .clusterBy tillsammans med .option('clusterByAuto', 'true)är beteendet följande:
- Om detta ställer in automatisk vätskeklustring för första gången, respekteras alltid den manuella inmatningen och kolumnerna för klustring i
.clusterByanges. - Om detta redan är en tabell med automatisk flytande klustring, kan en antydning med
.clusterByaccepteras en gång. De kolumner som anges av.clusterByanges till exempel bara om tabellen inte redan har några klustringskolumner angivna.
Du kan bara använda Python när du skapar eller ersätter en tabell. Använd SQL för att ändra status för clusterByAuto en befintlig tabell.
Kontrollera om automatisk klustring är aktiverat
Om du vill kontrollera om en tabell har automatisk flytande klustring aktiverad använder du DESCRIBE TABLE eller SHOW TBLPROPERTIES.
Om automatisk flytande klustring är aktiverad clusterByAuto är egenskapen inställd på true. Egenskapen clusteringColumns visar de aktuella klustringskolumnerna som har valts automatiskt eller manuellt.
Limitations
Automatisk vätskeklustring är inte tillgänglig för Apache Iceberg.
Skriva data till en klustrad tabell
Om du vill skriva till en klustrad Delta-tabell måste du använda en Delta-skrivarklient som stöder alla funktioner för deltaskrivprotokoll som används av dynamisk klustring. Om du vill skriva till en klustrad Iceberg-tabell kan du använda Unity Catalogs REST-Catalog API. På Azure Databricks måste du använda Databricks Runtime 13.3 LTS och senare.
Åtgärder som stöder klustring vid skrivning
Operationer som klustrar vid skrivning inkluderar följande:
-
INSERT INTOåtgärder -
CTAS- ochRTAS-satser -
COPY INTOfrån Parquet-formatet spark.write.mode("append")
Storlekströsklar för klustring
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.
Strömmande arbetsbelastningar
Strukturerade strömningsarbetsbelastningar stöder klustring vid skrivning när du ställer in Spark-konfigurationen spark.databricks.delta.liquid.eagerClustering.streaming.enabled på true. Klustring för dessa arbetsbelastningar utlöses endast om minst en av de fem senaste direktuppspelningsuppdateringarna överskrider ett storlekströskelvärde från tabellen ovan.
Så här utlöser du klustring
Förutsägande optimering kör automatiskt OPTIMIZE kommandon för aktiverade tabeller. Se Förutsägande optimering för hanterade Unity Catalog-tabeller. När du använder förutsägelseoptimering rekommenderar Databricks att du inaktiverar alla schemalagda OPTIMIZE jobb.
Om du vill utlösa klustring måste du använda Databricks Runtime 13.3 LTS eller senare. Databricks rekommenderar Databricks Runtime 17.2 och senare för snabbare OPTIMIZE prestanda på stora tabeller. Använd OPTIMIZE-kommandot på din tabell:
OPTIMIZE table_name;
Flytande klustring är inkrementell, vilket innebär att OPTIMIZE endast skriva om data efter behov för att hantera data som behöver klustring.
OPTIMIZE skriver inte om datafiler med klustringsnycklar som inte matchar de data som klustras.
Om du inte använder förutsägelseoptimering rekommenderar Databricks att du schemalägger 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 klustring av vätskor ä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;
Important
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. I det här scenariot OPTIMIZE använder en inkrementell metod och skriver bara om filer som inte tidigare har komprimerats. 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 Delta-tabell med valfri Delta Lake-klient som stöder läsning av borttagningsvektorer. Med hjälp av API:et för Isbergs REST-katalog kan du läsa data i en klustrad isbergstabell. Flytande klustring förbättrar frågeprestandan genom automatisk överhoppning av data vid filtrering av klustringsnycklar.
SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";
Hantera klustringsnycklar
Se hur en tabell klustras
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;
Ä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 klustrade data om, men framtida OPTIMIZE åtgärder hindras från att använda klustringsnycklar.
Använda flytande klustring från en extern motor
Du kan aktivera "liquid clustering" på hanterade Iceberg-tabeller från externa Iceberg-motorer. Om du vill aktivera flytande klustring anger du partitionskolumner när du skapar en tabell. Unity Catalog tolkar partitionerna som klustringsnycklar. Kör till exempel kommandot nedan i OSS Spark:
CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY c1;
Du kan inaktivera flytande klustring:
ALTER TABLE main.schema.icebergTable DROP PARTITION FIELD c2;
Du kan ändra klustringsnycklar med icebergpartitionsutveckling:
ALTER TABLE main.schema.icebergTable ADD PARTITION FIELD c2;
Om du anger en partition med en buckettransformering släpper Unity Catalog uttrycket och använder kolumnen som en klustringsnyckel:
CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY (bucket(c1, 10));
Kompatibilitet för tabeller med flytande klustring
Flytande klustring utnyttjar Delta-tabellfunktioner som kräver specifika versioner av Databricks Runtime för att läsa och skriva. 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 Ta bort en Delta Lake-tabellfunktion och nedgradera tabellprotokollet.
Åsidosätt standardfunktionsaktivering (valfritt)
Du kan åsidosätta deltatabellens standardfunktionsaktivering 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 TABLEfö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 deaktivering på flytande klusterbildning |
|---|---|---|---|
| Vektorer för borttagning | Läsningar och skrivningar kräver Databricks Runtime 12.2 LTS och senare. | 'delta.enableDeletionVectors' = false |
Om du inaktiverar borttagningsvektorer inaktiveras samtidighet på radnivå, 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 |
Om du inaktiverar radspårning inaktiveras samtidighet på radnivå, 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. |
Limitations
- DBR 15.1 och nedan: Klustring vid skrivning stöder inte källfrågor som innehåller filter, kopplingar eller aggregeringar.
- DBR 15.4 LTS och nedan: Du kan inte skapa en tabell med flytande klustring aktiverad med en skrivning för strukturerad direktuppspelning. Du kan använda Structured Streaming för att skriva data till en befintlig tabell med flytande klustring aktiverat.
- Apache Iceberg v2: Samtidighet på radnivå stöds inte på hanterade isbergstabeller med Apache Iceberg v2, eftersom borttagningsvektorer och radspårning inte stöds på Isbergstabeller.