Kommentar
Å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
Liquid clustering är allmänt tillgänglig för Delta Lake-tabeller från Databricks Runtime 15.4 LTS och senare, och som offentlig förhandsversion för Apache Iceberg-tabeller från Databricks Runtime 16.4 LTS och senare. Databricks rekommenderar att du använder den senaste Databricks Runtime för bästa prestanda.
Hanterade Apache Iceberg v3-tabeller stöder även borttagningsvektorer, radspårning, samtidighet på radnivå och automatisk flytande klustring. Dessa funktioner kräver Databricks Runtime 18.0 och senare. Se Använda Apache Iceberg v3-funktioner.
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:
- Frågor som filtrerar på kolumner med hög kardinalitet.
- Tabeller med kraftig datasnedvridning.
- Snabbväxande tabeller som kräver underhåll och justering.
- Tabeller med parallella skrivkrav.
- Tabeller med varierande eller föränderliga åtkomstmönster.
- Tabeller där en typisk partitionsnyckel kan returnera resultat från 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.3 LTS 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
Så här skapar du en tom tabell med klustring:
CREATE TABLE table1 (col0 INT, col1 STRING) CLUSTER BY (col0);
Om du vill skapa en tabell från befintliga data med klustring CLUSTER BY måste den visas efter tabellnamnet, inte i SELECT -satsen:
CREATE TABLE table2 CLUSTER BY (col0)
AS SELECT * FROM table1;
Så här kopierar du en tabellstruktur inklusive dess klustringskonfiguration:
CREATE TABLE table3 LIKE table1;
Python
Så här skapar du en tom tabell med klustring med hjälp av API:et DeltaTable :
(DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute())
Så här skapar du en tabell från en befintlig DataFrame:
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
Så här skapar du en tabell med hjälp av API:et DataFrameWriterV2 (finns i Databricks Runtime 14.2 och senare):
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Scala
Så här skapar du en tom tabell med klustring med hjälp av API:et DeltaTable :
DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute()
Så här skapar du en tabell från en befintlig DataFrame:
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
Så här skapar du en tabell med hjälp av API:et DataFrameWriterV2 (finns i Databricks Runtime 14.2 och senare):
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Important
När du använder DataFrame-API:er för att ange klustringsnycklar kan du bara ange klustringskolumner när tabellen skapas eller när du använder overwrite läge (till exempel med CREATE OR REPLACE TABLE åtgärder). Du kan inte ändra klustringsnycklar när du använder append läge.
Om du vill ändra klustringsnycklar i en befintlig tabell medan du lägger till data använder du SQL-kommandon ALTER TABLE för att ändra klustringskonfigurationen separat från dina dataskrivningsåtgärder. Titta på Ändra klustringsnycklar.
I Databricks Runtime 16.4 LTS och senare kan du skapa tabeller med liquid clustering med hjälp av skrivningar med Structured Streaming, 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")
Varning
Delta Lake-tabeller med liquid clustering aktiverad använder Delta-skrivarversion 7 och läsarversion 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.
Information om hur du åsidosätter standardfunktionsaktivering, till exempel borttagningsvektorer, finns i Åsidosätt standardfunktionsaktivering (valfritt)..
Aktivera i befintliga tabeller
Gör följande för att aktivera flytande klustring i en befintlig ej partitionerad Delta Lake-tabell:
ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)
Tänk på följande för hanterade Apache Iceberg-tabeller:
- För tabeller med v2-specifikationen måste du uttryckligen inaktivera borttagningsvektorer och radspårning när du aktiverar flytande klustring i en befintlig tabell.
- För tabeller med v3-specifikationen krävs det inte att dessa funktioner inaktiveras eftersom borttagningsvektorer och radspårning stöds. Se Använda Apache Iceberg v3-funktioner.
Note
Standardbeteendet gäller inte klustring för tidigare skrivna data. Om du vill framtvinga omargning använder du OPTIMIZE FULL eller OPTIMIZE FULL WHERE <predicate>. Se Framtvinga omargruppering.
Konvertera en partitionerad tabell till flytande klustring
I Databricks Runtime 18.1 och senare versioner använder du REPLACE PARTITIONED BY WITH CLUSTER BY i en ALTER TABLE-sats för att konvertera en befintlig partitionerad Delta Lake-tabell till liquid clustering. Konvertering minimerar läs- och skrivaravbrott och stöder både externa och hanterade tabeller. Efter konverteringen stöder tabellen läsningar med Databricks Runtime 13.3 LTS och senare.
Note
För hanterade Iceberg-tabeller är konvertering inte nödvändigt eftersom dessa tabeller använder partitionsdefinitioner som flytande klustringsnycklar. När du kör konverteringskommandot genereras ett fel.
Fördelarna med att konvertera partitionerade tabeller till flytande klustring är:
- Prestandaförbättringar för tabeller som har problem med bristfällig dataskippning eller överpartitionering.
- Automatiska prestandaförbättringar, med hjälp av
CLUSTER BY AUTO, för tabeller med ofta föränderliga frågemönster. - Klustringskolumner är flexibla och enkla att ändra, medan partitionering är stel och svår att ändra.
- Minskade skrivkonflikter eftersom tabeller med flytande klustring möjliggör samtidighet på radnivå. Se konkurrens på radnivå.
Syntax
ALTER TABLE <table_name>
REPLACE PARTITIONED BY WITH CLUSTER BY [( <clustering_columns> ) | AUTO]
CLUSTER BY Satsen stöder följande alternativ:
-
( <clustering_columns> ): Anger nya klustringskolumner. Databricks rekommenderar att du behåller de nya klustringskolumnerna som liknar de ursprungliga partitionskolumnerna. Att använda mycket olika kolumner utlöser en stor omklustring vid den förstaOPTIMIZE-körningen. -
AUTO: Använder de aktuella partitionskolumnerna som de första klustringskolumnerna och låter förutsägande optimering anpassas över tid. Endast tillgängligt för hanterade Unity Catalog-tabeller. Se Automatisk flytande klustring. - Inga alternativ har angetts: Använder de aktuella partitionskolumnerna som de nya klustringskolumnerna.
Information om hur du väljer klustringsnycklar när du migrerar från partitionerade tabeller finns i Migrera från partitionering eller Z-ordning.
Examples
Om du vill klustra på andra kolumner än de ursprungliga partitionerna, till exempel för en tabell partitionerad på (year, month, day), gör du följande:
ALTER TABLE t1 REPLACE PARTITIONED BY WITH CLUSTER BY (day, id);
OPTIMIZE t1;
Note
Om du vill dra nytta av att ändra klustringskolumner måste du köra OPTIMIZE.
Om du vill använda automatisk flytande klustring och börja med de aktuella partitionskolumnerna gör du följande:
ALTER TABLE t2 REPLACE PARTITIONED BY WITH CLUSTER BY AUTO;
Gör följande för att behålla de aktuella partitionskolumnerna som klustringskolumner:
ALTER TABLE t3 REPLACE PARTITIONED BY WITH CLUSTER BY;
Hantera samtidiga läsningar och skrivningar under konverteringen
Efter konverteringen stöds Databricks Runtime 13.3 LTS och senare för läsningar och skrivningar. Azure Databricks rekommenderar Databricks Runtime 15.4 LTS och senare för arbetsbelastningar som läser eller skriver till tabellen under konverteringen.
I följande tabell finns information om hur du hanterar samtidiga läs- och skrivarbetsbelastningar under konverteringen:
| Typ av arbetsbelastning | Läsningar under konvertering | Skrivningar under konvertering |
|---|---|---|
| Batch | Ingen stilleståndstid. Alla Databricks Runtime-versioner kan läsa tabellen under konverteringen. | Ingen stilleståndstid på Databricks Runtime 15.4 och senare. För Databricks Runtime 15.3 och senare rekommenderar Databricks att du pausar arbetsbelastningar innan du konverterar och sedan startar om arbetsbelastningar när konverteringen har slutförts. |
| Streaming |
Med schemaspårning och kolumnmappning: Starta om strömmen utan att förlora några incheckningar. Utan schemaspårning och kolumnmappning: Strömmen genererar ett undantag. Starta om med en ny kontrollpunktsplats och startversion. Incheckningar går inte förlorade. |
Starta om streamen utan att förlora några commitar. |
Verifiera eller återställa en konvertering
Bekräfta konverteringen genom att köra DESCRIBE EXTENDED för att se de nya klustringskolumnerna. Kör DESCRIBE HISTORY för att se en serie REORG åtgärder, en UPGRADE PROTOCOL åtgärd och en REPLACE PARTITIONED BY WITH CLUSTER BY åtgärd.
Om du vill återställa en konvertering använder du RESTORE för att återgå till den tidigare versionen. Du kan också skriva om tabellen med hjälp av REPLACE TABLE ... PARTITIONED BY (...) AS SELECT * FROM ....
Kör följande kommandon för att återställa med hjälp av RESTORE:
ALTER TABLE my_table CLUSTER BY NONE;
ALTER TABLE my_table UNSET TBLPROPERTIES ('delta.liquid.hierarchicalClusteringColumns');
RESTORE TABLE my_table TO VERSION AS OF <version_number_before_conversion>;
Se även RESTORE.
Konvertera en tabell som partitionerats av en tidsstämpelkolumn
Om du vill konvertera en tabell (t1) som partitioneras av en tidsstämpelkolumn (timestamp_col) och använda tidsstämpelkolumnen som en klustringsnyckel måste du ange ytterligare konfigurationer:
SET spark.databricks.delta.liquidConversion.statsGeneration.enabled = false;
ALTER TABLE t1 REPLACE PARTITIONED BY WITH CLUSTER BY (timestamp_col, id);
ANALYZE TABLE t1 COMPUTE DELTA STATISTICS;
Om du försöker konvertera en tidsstämpelpartitionskolumn till en klustringskolumn utan dessa konfigurationer genererar kommandot ett fel:
ALTER TABLE REPLACE PARTITIONED BY WITH CLUSTER BY cannot auto-generate stats on table with column event_ts due to unsupported type: timestamp. Disable stats auto-generation by setting 'spark.databricks.delta.liquidConversion.statsGeneration.enabled' to 'false' and retry the command again. SQLSTATE: 42000
Konverteringsbegränsningar
Följande begränsningar gäller för konverteringskommandot REPLACE PARTITIONED BY WITH CLUSTER BY :
- Strömmande tabeller och materialiserade vyer som skapats i Lakeflow-pipelines stöds inte. Om du vill använda flytande klustring måste du uppdatera pipelinedefinitionen så att den används
CLUSTER BYi stället förPARTITIONED BY. - Tabeller som använder Deltadelning med partitionsfiltrering stöds inte. Information om partitionsfiltrering för deltadelning finns i Ange tabellpartitioner som ska delas.
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
Välj klustringsnycklar baserat på de kolumner som oftast används i frågefilter. Rätt val av nycklar förbättrar dataskippning och frågeprestanda avsevärt.
Tips/Råd
Databricks rekommenderar att du använder automatisk flytande klustring för att intelligent välja 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 (mindre än 10 TB) kan fler klusternycklar 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 samlar Delta Lake-tabeller in statistik för de första 32 kolumnerna. Se Ange statistikkolumner.
Datatyper som stöds
Klustring stöder dessa datatyper för klustringsnycklar:
- Date
- Tidsstämpel
- TidsstämpelNTZ (Databricks Runtime 14.3 LTS och senare)
- String
- Heltal, Lång, Kort, Byte
- Flyttal, dubbel, decimal
Du kan klustra utifrån en StructField med punktnotation, till exempel CLUSTER BY (struct_col.field). Kapslade structfält stöds på alla djup, till exempel CLUSTER BY (struct_col.nested.field). Fältets datatyp måste vara en av de typer som stöds i föregående lista.
Du kan inte gruppera efter något av följande:
- Komplexa typer, till exempel
StructType,MapTypeellerArrayType -
MapTypeochArrayTypeelement, till exempelmap_col['key'],array_col[0]ellermap_col.key.
Migrera från partitionering eller Z-ordning
Important
Databricks rekommenderar att du använder den automatiska konverteringen med REPLACE PARTITIONED BY WITH CLUSTER BY kommandot . Se Konvertera en partitionerad tabell till flytande klustring.
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 Unity Catalog-hanterade Delta Lake-tabeller. För Unity Catalog-hanterade Apache Iceberg v3-tabeller kräver automatisk vätskebaserad klustring Databricks Runtime 18.0 eller senare. Med automatisk flytande klustring kan Azure Databricks på ett intelligent sätt välja klusternycklar för att optimera frågeprestandan med hjälp av satsen CLUSTER BY AUTO.
Note
Automatisk flytande klustring stöds också för materialiserade vyer och strömmande tabeller, inklusive Lakeflow-pipelines och fristående pipelines. Ange CLUSTER BY AUTO i din pipeline- eller SQL-definition.
Så här fungerar automatisk flytande klustring
Automatisk flytande klustring kräver förutsägande optimering för automatisk nyckelval och klustringsåtgärder och körs asynkront. Se Förutsägande optimering för hanterade Unity Catalog-tabeller.
Automatisk flytande klustring tillämpar intelligenta optimeringar baserat på dina användningsmönster:
- 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.
Databricks Runtime-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
SQL
Så här skapar du en tabell med automatisk flytande klustring:
CREATE OR REPLACE TABLE table1 (column01 int, column02 string) CLUSTER BY AUTO;
Så här aktiverar du automatisk flytande klustring i en befintlig tabell, inklusive tabeller med manuellt angivna nycklar:
ALTER TABLE table1 CLUSTER BY AUTO;
Ange inledande klustringskolumntips för nyckelval genom att ange klustringsnycklarna och sedan aktivera automatisk klustring:
ALTER TABLE table1 CLUSTER BY (c1, c2);
ALTER TABLE table1 CLUSTER BY AUTO;
Du kan också använda api:et Python för att ange tips i en enda åtgärd.
Så här inaktiverar du automatisk flytande klustring:
ALTER TABLE table1 CLUSTER BY NONE;
Så här inaktiverar du automatisk flytande klustring och anger klustringskolumner:
ALTER TABLE table1 CLUSTER BY (column01, column02);
Om en befintlig tabell har automatisk liquid clustering aktiverad, stänger körning av CREATE OR REPLACE table_name utan CLUSTER BY AUTO av automatisk klustring och bevarar inte klustringskolumnerna. Om du vill bevara automatisk flytande klustring och eventuella tidigare valda kolumner tar du med CLUSTER BY AUTO i ersättningsinstruktionen. Med CLUSTER BY AUTOanvänder förutsägelseoptimering den historiska frågearbetsbelastningen för tabellen för att identifiera de bästa klustringsnycklarna.
Python
Python-API:et är tillgängligt i Databricks Runtime 16.4 och senare. 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.
Så här skapar du en tabell med automatisk flytande klustring med hjälp av DataFrameWriter:
df = spark.read.table("table1")
df.write
.format("delta")
.option("clusterByAuto", "true")
.saveAsTable(...)
Ange inledande klustringskolumntips för nyckelval med hjälp av DataFrameWriter:
df.write
.format("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option("clusterByAuto", "true")
.saveAsTable(...)
Så här skapar du en tabell med automatisk flytande klustring med hjälp av DataFrameWriterV2:
df.writeTo(...).using("delta")
.option("clusterByAuto", "true")
.create()
Ange inledande klustringskolumntips för nyckelval med hjälp av DataFrameWriterV2:
df.writeTo(...).using("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option("clusterByAuto", "true")
.create()
Så här skapar du en strömningstabell med automatisk flytande klustring:
spark.readStream.table("source_table")
.writeStream
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
Så här anger du inledande klustringskolumntips för nyckelval i en strömmande tabell:
spark.readStream.table("source_table")
.writeStream
.clusterBy("column1", "column2")
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
När du använder .clusterBy för tips om att välja klusternycklar tillsammans med .option('clusterByAuto', 'true')är beteendet följande:
- Om detta anger automatisk flytande klustring för första gången anges klustringskolumnerna till de angivna kolumnerna i
.clusterBy. - Om det här är en befintlig tabell med automatisk liquid clustering aktiverad, accepteras en
.clusterByhint bara en gång. De kolumner som anges av.clusterByanges till exempel bara om tabellen inte har grupperingskolumner angivna.
Important
Vid användning av DataFrame-API:er clusterByAuto kan alternativet bara anges när du använder overwrite läge. Du kan inte ange clusterByAuto när du använder append läge. Den här begränsningen är densamma som när du ställer in klustringskolumner manuellt. Du kan bara konfigurera klustringsinställningar när du skapar eller ersätter tabeller med hjälp av overwrite läge.
Om du vill ändra status för clusterByAuto en befintlig tabell när du lägger till data kan du använda SQL-kommandon ALTER TABLE för att ändra klustringskonfigurationen separat från dina dataskrivningsåtgärder.
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 flytande klustring är inte tillgängligt för hanterade Apache Iceberg v2-tabeller. Det stöds för hanterade Apache Iceberg v3-tabeller i Databricks Runtime 18.0 och senare.
Skriva data till en klustrad tabell
För att skriva till en Delta Lake-tabell med klustring måste du använda en skrivklient för Delta som stöder alla tabellfunktioner i Deltas skrivprotokoll som används av liquid clustering. 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 Lake-tabeller.
| Antal klustringskolumner | Tröskelvärdesstorlek för hanterade Unity Catalog-tabeller | Tröskelvärdesstorlek för andra Delta Lake-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.3 LTS 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. Se Framtvinga omargruppering.
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 omklustring
I Databricks Runtime 16.4 LTS och senare versioner kan du tvinga fram omklustring 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.
Partiell omklustring
I Databricks Runtime 18.1 och senare kan du framtvinga relustering för en delmängd av poster med hjälp av OPTIMIZE FULL WHERE <predicate>. En fil inkluderas om någon del av dess intervall överlappar predikatet. Se Parametrar.
OPTIMIZE events FULL WHERE event_date >= '2025-01-01';
Läsa data från en klustrad tabell
Du kan läsa data i en klustrad Delta Lake-tabell med hjälp av alla Delta Lake-klienter 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. Information om hur du skriver om befintliga data med de uppdaterade klustringsnycklarna kan du läsa om i Tvinga omklustring.
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;
Så här inaktiverar du flytande klustring:
ALTER TABLE main.schema.icebergTable DROP PARTITION FIELD c2;
Så här ändrar du 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 kluster använder Delta Lake-tabellfunktioner som kräver specifika Databricks Runtime-versioner för läsning och skrivning. Tabeller som skapats med flytande klustring i Databricks Runtime 14.3 LTS och senare använder kontrollpunkt V2 som standard. Du kan läsa och skriva tabeller med kontrollpunkt V2 i Databricks Runtime 13.3 LTS och senare. Se Kontrollpunkt V2.
Om du vill stödja läsare som använder Databricks Runtime 12.2 LTS till 13.2 inaktiverar du kontrollpunkt V2 och nedgraderar tabellprotokollet. Se Nedgradera till klassisk.
Åsidosätt standardfunktionsaktivering (valfritt)
Du kan åsidosätta standardinställningen för aktivering av Delta Lake-tabellfunktioner när du aktiverar flytande klustring. Detta förhindrar uppgraderingar av de läsar- och skrivprotokoll som är associerade med dessa tabellfunktioner. 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>)
I följande tabell finns 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 | Effekter på vätskeklustring om det stängs av |
|---|---|---|---|
| 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 också samtidighet på radnivå, vilket gör transaktioner och klustringsåtgärder mer benägna att vara i konflikt. Se konkurrens 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 också samtidighet på radnivå, vilket gör transaktioner och klustringsåtgärder mer benägna att vara i konflikt. Se konkurrens på radnivå. |
| Kontrollpunkt V2 | Läsningar och skrivningar kräver Databricks Runtime 13.3 LTS och senare. | 'delta.checkpointPolicy' = 'classic' |
Ingen effekt på vätskeklustringsbeteendet. Se Kontrollpunkt V2. |
Limitations
- Databricks Runtime 15.1 och nedan: Klustring vid skrivning stöder inte källfrågor som innehåller filter, kopplingar eller aggregeringar.
- Databricks Runtime 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 i hanterade Apache Iceberg v2-tabeller eftersom borttagningsvektorer och radspårning inte stöds.
- Samtidighet på radnivå stöds i hanterade Apache Iceberg v3-tabeller eftersom v3-specifikationen stöder borttagningsvektorer och radspårning. Se Använda Apache Iceberg v3-funktioner.