Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Clustering Liquid nahrazuje dělení tabulek a ZORDER
, zjednodušuje rozhodování o rozložení dat a optimalizuje výkon dotazů. Poskytuje flexibilitu předefinovat klíče clusteringu bez přepsání stávajících dat, což umožňuje, aby se rozložení dat v průběhu času vyvíjelo společně s analytickými potřebami. Liquid Clustering se vztahuje jak na streamovací tabulky, tak na materializovaná zobrazení.
Důležité
Liquid Clustering je obecně dostupné pro Delta Lake a ve veřejném náhledu pro Apache Iceberg.
Pro všechny tabulky Delta Lake s povoleným liquid clusteringem doporučuje Databricks používat Databricks Runtime 15.2 a vyšší. Podpora verze Public Preview s omezeními je dostupná v Databricks Runtime 13.3 LTS a novějších verzích. Souběžnost na úrovni řádků je podporována v Databricks Runtime 13.3 LTS a vyšší a je obecně dostupná v Databricks Runtime 14.2 a vyšší pro všechny tabulky s povolenými vektory odstranění. Viz Úrovně izolace a konflikty zápisu v Azure Databricks.
Pro všechny tabulky Apache Iceberg, u nichž je povoleno tekuté seskupování, se vyžaduje Databricks Runtime 16.4 LTS a vyšší.
K čemu se používá shlukování kapalin?
Databricks doporučuje klastrování kapalin pro všechny nové tabulky, včetně streamingových tabulek (ST) i materializovaných zobrazení (MV). Tady jsou příklady scénářů, které využívají clustering:
- Tabulky se často filtrují podle sloupců s vysokou kardinalitou.
- Tabulky s významnou nerovnoměrnou distribucí dat.
- Tabulky, které rychle rostou a vyžadují údržbu a optimalizaci.
- Tabulky s požadavky na souběžné zapisování.
- Tabulky se vzory přístupu, které se v průběhu času mění.
- Tabulky, kde by typický klíč oddílu mohl způsobit, že tabulka má příliš mnoho nebo příliš málo oddílů.
Povolit clustering kapaliny
Můžete povolit liquid clustering u existující tabulky nebo během jejího vytváření. Clustering není kompatibilní s dělením nebo ZORDER
a vyžaduje, abyste ke správě všech operací rozložení a optimalizace dat v tabulce použili Azure Databricks. Po povolení funkce shlukování typu liquid spusťte OPTIMIZE
úlohy jako obvykle pro postupné shlukování dat. Viz Postup aktivace clusteringu.
Pokud chcete povolit shlukování tekutiny, přidejte frázi CLUSTER BY
do příkazu pro vytvoření tabulky, jak je uvedeno v následujících příkladech.
Poznámka:
V Databricks Runtime 14.2 a novějších můžete pomocí rozhraní DataFrame API a rozhraní DeltaTable API v Pythonu nebo Scala povolit liquid clustering pro tabulky Delta Lake.
SQL
-- Create an empty Delta 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;
U Apache Iceberg je nutné explicitně zakázat vektory mazání a ID řádků při povolení funkce Liquid Clustering ve spravované tabulce Iceberg.
Krajta
# Create an empty Delta 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 Delta 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()
V Databricks Runtime 16.0 a novějších můžete vytvářet tabulky s povoleným liquid clusteringem pomocí zápisů strukturovaného streamování, jak je uvedeno v následujících příkladech.
:::
SQL
CREATE TABLE table1 (
col0 STRING,
col1 DATE,
col2 BIGINT
)
CLUSTER BY (col0, col1)
TBLPROPERTIES (
'clusterByAuto' = 'true'
);
Krajta
(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")
Varování
Tabulky Delta vytvořené s povoleným tekutým clusterováním mají při vytváření povolenou řadu funkcí tabulky Delta a používají Delta Writer verze 7 a verzi čtečky 3. Můžete změnit povolení některých z těchto funkcí. Viz Přepsání výchozího nastavení funkce (volitelné).
Verze protokolu tabulky nelze downgradovat a tabulky s povoleným clusteringem nejsou čitelné klienty Delta Lake, kteří nepodporují všechny povolené funkce tabulek protokolu Delta Reader. Viz kompatibilita a protokoly funkcí Delta Lake.
Pomocí následující syntaxe povolte kapalné shlukování v existující, nepartitionované Delta tabulce.
-- Alter an existing table
ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)
U Apache Icebergu musíte explicitně zakázat vektory odstranění a ID řádků při povolování likvidního clusterování v existující spravované tabulce Iceberg.
Důležité
Výchozí chování nepoužívá clustering na dříve zapsaná data. Chcete-li vynutit reklasifikaci pro všechny záznamy, je nutné použít OPTIMIZE FULL
. Viz Vynucení přeclusterování pro všechny záznamy.
Pokud chcete odebrat klíče clusteringu, použijte následující syntaxi:
ALTER TABLE table_name CLUSTER BY NONE;
automatické shlukování kapalin
Ve verzi Databricks Runtime 15.4 LTS a vyšších můžete aktivovat automatický liquidní clustering pro tabulky Delta spravované službou Unity Catalog. S povoleným automatickým clusteringem liquid si Azure Databricks inteligentně vybírá klíče clusteringu pro optimalizaci výkonu dotazů. Automatické shlukování kapalin povolíte pomocí klauzule CLUSTER BY AUTO
.
Pokud je tato možnost povolená, operace automatického výběru klíčů a clusteringu běží asynchronně jako operace údržby a vyžadují, aby byla pro tabulku povolená prediktivní optimalizace. Viz Prediktivní optimalizace spravovaných tabulek v katalogu Unity.
Aby bylo možné identifikovat klíče clusteringu, Azure Databricks analyzuje historickou úlohu dotazu tabulky a identifikuje nejlepší kandidátské sloupce. Klíče seskupení se změní, když předpokládané úspory nákladů z vylepšení přeskakování dat převáží náklady na seskupení dat.
Pokud se způsob, jakým dotazujete svá data, mění v průběhu času nebo pokud výkon dotazů naznačuje změny v distribuci dat, automatické liquid clusterování vybere nové klíče pro optimalizaci výkonu.
Pokud klíč nebyl vybrán automatickým shlukováním kapalin, důvodem může být:
- Tabulka je příliš malá, aby byla přínosná pro shlukování kapalin.
- Tabulka již má dobré schéma clusteringu. Má například dobré klíče, které byly dříve úspěšně použity, nebo pořadí vložení již dobře funguje pro daný vzor dotazu. Například data vložená chronologicky a dotazovaná podle časového razítka.
- Tabulka neobsahuje časté dotazy.
- Nepoužíváte Databricks Runtime 15.4 LTS nebo novější.
Můžete použít automatické seskupování dat pro všechny tabulky spravované pomocí Katalogu Unity, bez ohledu na data a vlastnosti dotazů. Tyto funkce poskytují inteligentní optimalizaci rozložení dat na základě vzorů využití dat a heuristiky se rozhodnou, jestli je cenově výhodné vybrat klíče clusteringu.
Poznámka:
Tabulky můžete číst nebo zapisovat s povoleným automatickým clusteringem ve všech verzích Databricks Runtime, které podporují tekuté clustering. Výběr inteligentního klíče ale závisí na metadatech zavedených v Databricks Runtime 15.4 LTS. Pomocí databricks Runtime 15.4 LTS nebo vyšší zajistěte, aby automaticky vybrané klíče využívaly všechny vaše úlohy a aby se tyto úlohy při výběru nových klíčů zvažují.
Povolení nebo zakázání automatického seskupení kapalin
Pokud chcete povolit nebo zakázat automatické shlukování kapalin v nové nebo existující tabulce, použijte následující syntaxi:
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);
Poznámka:
Pokud spustíte CREATE OR REPLACE table_name
bez zadání CLUSTER BY AUTO
a tabulka již existuje a je povoleno automatické clusteringové seskupení, nastavení AUTO
a sloupce seskupení pro tabulku (pokud jsou použity) se při nahrazení tabulky zachovají. Prediktivní optimalizace také udržuje historickou úlohu dotazů pro tuto tabulku, aby identifikovala nejlepší klíče clusteringu.
Krajta
df = spark.read.table("table1")
df.write
.format("delta")
.option(“clusterByAuto”, “true”)
.saveAsTable(...)
# To set clustering columns and auto, which serves as a way to give a hint
# for the initial selection.
df.write
.format("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option(“clusterByAuto”, “true”)
.saveAsTable(...)
# Using DataFrameWriterV2
df.writeTo(...).using("delta")
.option(“clusterByAuto”, “true”)
.create()
# To set clustering columns and auto, which serves as a way to give a hint
# for the initial selection.
df.writeTo(...).using("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option(“clusterByAuto”, “true”)
.create()
# Similar syntax can also be used to set clusterByAuto for streaming tables.
spark.readStream.table("source_table")
.writeStream
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
# Or to specify a hint for the clustering columns by specifying both auto and columns together
spark.readStream.table("source_table")
.writeStream
.clusterBy("column1", "column2")
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
Poznámka:
Rozhraní Python API je k dispozici v Databricks Runtime 16.4 a novějších.
Při použití .clusterBy
společně s .option('clusterByAuto', 'true)
:
- Pokud tato funkce nastaví automatické shlukování kapalin poprvé, bude vždy respektovat ruční vstup a nastavit sloupce clusteringu v
.clusterBy
. - Pokud už se jedná o tabulku s automatickým shlukováním dat kapalin, lze jednou přijmout nápovědu pomocí
.clusterBy
. Například sloupce určené podle.clusterBy
jsou nastaveny pouze v případě, že tabulka ještě nemá žádné clusteringové sloupce nastavené buď vámi, nebo automatickým shlukováním kapalin.
Python můžete použít jenom při vytváření nebo nahrazování tabulky. Pomocí SQL můžete změnit clusterByAuto
stav existující tabulky.
Kontrola povolení automatického clusteringu
Pokud chcete zkontrolovat, jestli je v tabulce zapnuté automatické shlukování kapalin, použijte DESCRIBE TABLE
nebo SHOW TBLPROPERTIES
.
Pokud je zapnuté automatické shlukování kapalin, je vlastnost clusterByAuto
nastavena na hodnotu true
. Tato clusteringColumns
vlastnost zobrazuje aktuální sloupce clusteringu, které byly automaticky nebo ručně vybrány.
Omezení
Automatické shlukování kapalin není k dispozici pro Apache Iceberg.
Přepsat výchozí povolení funkce (volitelné)
Výchozí chování, které umožňuje funkce tabulek Delta při povolování tekutého clusteringu, můžete přepsat. Zabráníte tak upgradu protokolů čtenáře a zapisovače přidružených k těmto funkcím tabulek. Abyste mohli provést následující kroky, musíte mít existující tabulku:
Slouží
ALTER TABLE
k nastavení vlastnosti tabulky, která zakazuje jednu nebo více funkcí. Pokud chcete například zakázat vektory odstranění, spusťte následující příkaz:ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
Povolte liquid clustering v tabulce spuštěním následujícího příkazu:
ALTER TABLE <table_name> CLUSTER BY (<clustering_columns>)
Následující tabulka obsahuje informace o funkcích Delta, které můžete přepsat a jak povolení ovlivňuje kompatibilitu s verzemi Databricks Runtime.
Funkce Delta | Kompatibilita modulu runtime | Vlastnost pro překonání aktivace | Dopad zneschopnění na seskupování kapalin |
---|---|---|---|
Vektory odstranění | Čtení a zápisy vyžadují Databricks Runtime 12.2 LTS a vyšší. | 'delta.enableDeletionVectors' = false |
Souběžnost na úrovni řádků je zakázána, takže transakce a operace clusteringu budou s větší pravděpodobností kolidovat. Vizte Konflikty zápisu na úrovni řádkové souběžnosti.DELETE , MERGE a UPDATE příkazy můžou běžet pomaleji. |
Sledování řádků | Operace zápisu vyžadují Databricks Runtime 13.3 LTS nebo vyšší. Je možné číst z jakékoli verze Databricks Runtime. | 'delta.enableRowTracking' = false |
Souběžnost na úrovni řádků je zakázána, takže transakce a operace clusteringu budou s větší pravděpodobností kolidovat. Vizte Konflikty zápisu na úrovni řádkové souběžnosti. |
Kontrolní body V2 | Čtení a zápisy vyžadují Databricks Runtime 13.3 LTS a vyšší. | 'delta.checkpointPolicy' = 'classic' |
Žádný vliv na chování clustrování kapalin. |
Volba klíčů clusteringu
Databricks doporučuje automatické shlukování kapalin pro podporované tabulky. Viz automatické shlukování kapalin.
Databricks doporučuje zvolit klíče clusteringu na základě sloupců, které se nejčastěji používají ve filtrech dotazů. Klíče clusteringu je možné definovat v libovolném pořadí. Pokud jsou dva sloupce vysoce korelované, stačí jeden z nich zahrnout jenom jako klíč clusteringu.
Můžete zadat až čtyři klíče clusteringu. U menších tabulek (pod 10 TB) může použití více klíčů clusteringu (například čtyři) snížit výkon při filtrování v jednom sloupci oproti použití menšího počtu klíčů clusteringu (například dvě). S rostoucí velikostí tabulky se ale rozdíl v výkonu při použití více klíčů clusteringu pro dotazy s jedním sloupcem stává zanedbatelný.
Můžete zadat pouze sloupce, které mají statistiky shromážděné jako klíče clusteringu. Ve výchozím nastavení se statistiky shromažďují pro prvních 32 sloupců v tabulce Delta. Viz Určení sloupců statistiky Delta.
Clustering podporuje pro klíče clusteringu následující datové typy:
- Datum
- Časové razítko
- TimestampNTZ (vyžaduje Databricks Runtime 14.3 LTS nebo vyšší)
- Řetězec
- Celé číslo
- Dlouhý
- Krátké
- Plovat
- Dvojitý
- Desetinné číslo
- byte
Pokud převádíte existující tabulku, zvažte následující doporučení:
Aktuální technika optimalizace dat | Doporučení pro klíče clusteringu |
---|---|
Dělení ve stylu Hive | Používejte partiční sloupce jako klíče seskupení. |
Indexování Z-pořadí | Použijte sloupce ZORDER BY jako klíče pro seskupování. |
Particionování ve stylu Hive a „Z-order“ | Používejte oddílové sloupce i sloupce ZORDER BY jako klíče clusteringu. |
Vygenerované sloupce pro snížení kardinality (například datum časového razítka) | Použijte původní sloupec jako klíč clusteringu a nevytvávejte vygenerovaný sloupec. |
Zápis dat do clusterované tabulky
Pokud chcete zapisovat do clusterované tabulky Delta, musíte použít klienta Delta Writer, který podporuje všechny funkce tabulek protokolu zápisu Delta používané clusteringem liquid. K zápisu do clusterované tabulky Iceberg můžete použít rozhraní REST Catalog API katalogu Unity. V Azure Databricks musíte použít Databricks Runtime 13.3 LTS a vyšší.
Mezi operace, které se skupinově zapisují, patří:
-
INSERT INTO
operací -
CTAS
aRTAS
příkazy -
COPY INTO
z formátu Parquet spark.write.mode("append")
Strukturované streamování nikdy nevyvolává clusterování při zápisu. Platí další omezení. Viz Omezení.
Clustering při zápisu se aktivuje pouze v případech, kdy data v transakci splňují prahovou hodnotu velikosti. Tyto prahové hodnoty se liší podle počtu sloupců clusteringu a jsou nižší pro spravované tabulky Katalogu Unity než u jiných tabulek Delta.
Počet klastrovacích sloupců | Prahová velikost spravovaných tabulek v katalogu Unity | Velikost prahové hodnoty pro ostatní tabulky Delta |
---|---|---|
1 | 64 MB | 256 MB |
2 | 256 MB | 1 GB |
3 | 512 MB | 2 GB |
4 | 1 GB | 4 GB |
Vzhledem k tomu, že ne všechny operace aplikují "liquid clustering," Databricks doporučuje časté spuštění OPTIMIZE
k zajištění efektivního vytváření clusterů pro všechna data.
Jak spustit shlukování
Prediktivní optimalizace automaticky spouští OPTIMIZE příkazy pro povolené tabulky. Viz Prediktivní optimalizace spravovaných tabulek v katalogu Unity. Při použití prediktivní optimalizace doporučuje Databricks zakázat všechny naplánované OPTIMIZE úlohy.
K aktivaci clusteringu musíte použít Databricks Runtime 13.3 LTS nebo vyšší. Na vaší tabulce použijte příkaz OPTIMIZE
.
OPTIMIZE table_name;
Liquid clustering je přírůstkový proces, což znamená, že data se přepisují jen v případě potřeby, aby umožnila seskupování dat, která je třeba seskupit. Datové soubory s klíči clusteringu, které neodpovídají datům, která se mají seskupit, se nepřepíšou.
Pokud nepoužíváte prediktivní optimalizaci, Databricks doporučuje naplánovat pravidelné úlohy k seskupení dat. U tabulek, u kterých dochází k mnoha aktualizacím nebo vkládáním, databricks doporučuje naplánovat OPTIMIZE
úlohu každých jednu nebo dvě hodiny. Vzhledem k tomu, že kapalinové seskupování je přírůstkové, většina OPTIMIZE
úloh pro seskupené tabulky je zpracována rychle.
Vynutit rekategorizaci pro všechny záznamy
V Databricks Runtime 16.0 a novějších můžete vynutit přeskupení všech záznamů v tabulce pomocí následující syntaxe:
OPTIMIZE table_name FULL;
Důležité
Příkaz OPTIMIZE FULL
podle potřeby přeskupuje všechna existující data. U velkých tabulek, které nebyly dříve clusterovány na zadaných klíčích, může tato operace trvat hodiny.
Spusťte OPTIMIZE FULL
při prvním povolení clusteringu nebo změně klíčů clusteringu. Pokud jste dříve spustili OPTIMIZE FULL
a nedošlo k žádné změně klíčů clusteringu, OPTIMIZE FULL
se spustí stejně jako OPTIMIZE
. V tomto scénáři OPTIMIZE
se používá přírůstkový přístup a pouze přepisuje soubory, které nebyly dříve komprimovány. Vždy používejte OPTIMIZE FULL
k zajištění toho, aby rozložení dat odráželo aktuální klíče clusteringu.
Čtení dat z clusterované tabulky
Data v clusterované tabulce Delta můžete číst pomocí libovolného klienta Delta Lake, který podporuje čtení vektorů odstranění. Pomocí rozhraní API katalogu Iceberg můžete číst data v clusterované tabulce Iceberg.
SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";
Změna klíčů clusteringu
Klíče clusteringu pro tabulku můžete kdykoli změnit spuštěním ALTER TABLE
příkazu, jak je znázorněno v následujícím příkladu:
ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);
Když změníte klíče clusteringu, následné OPTIMIZE
operace zápisu používají nový přístup ke clusteringu, ale stávající data se nepřepíší.
Clustering můžete také vypnout nastavením klíčů na NONE
, jako v následujícím příkladu:
ALTER TABLE table_name CLUSTER BY NONE;
Nastavení klíčů clusteru na NONE
nepřepisuje data, která již byla seskupena, ale brání tomu, aby budoucí operace OPTIMIZE
používaly klíče clusteru.
Použití seskupování kapalin z externího systému
Na spravovaných tabulkách Icebergu můžete povolit shlukování kapalin z externích ledových motorů. Pokud chcete povolit liquid shlukování, určete sloupce oddílů při vytváření tabulky. Katalog Unity interpretuje oddíly jako klíče clusteringu. Spusťte například následující příkaz v OSS Sparku:
CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY c1;
Můžete zakázat seskupování kapalin.
ALTER TABLE main.schema.icebergTable DROP PARTITION FIELD c2;
Klíče clusteringu můžete změnit pomocí vývoje oddílů Iceberg:
ALTER TABLE main.schema.icebergTable ADD PARTITION FIELD c2;
Pokud zadáte oddíl pomocí bucket transformace, Katalog Unity výraz odstraní a použije sloupec jako klíč pro shlukování.
CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY (bucket(c1, 10));
Podívejte se, jak je tabulka clusterovaná.
Pomocí DESCRIBE
příkazů můžete zobrazit klíče clusteringu pro tabulku, jak je znázorněno v následujících příkladech:
DESCRIBE TABLE table_name;
DESCRIBE DETAIL table_name;
Kompatibilita tabulek s clusteringem liquid
Tabulky vytvořené pomocí clusteringu liquid v Databricks Runtime 14.1 a vyšší používají ve výchozím nastavení kontrolní body v2. S kontrolními body v2 můžete číst a zapisovat tabulky v Databricks Runtime 13.3 LTS a novějších verzích.
Můžete zakázat kontrolní body verze 2 a snížit verzi protokolu tabulky, abyste mohli číst tabulky s liquid clusteringem v Databricks Runtime 12.2 LTS a vyšších. Viz Funkce odstranění tabulky Delta Lake a snížení verze protokolu tabulky.
Omezení
Jsou to následující omezení:
- Ve verzích Databricks Runtime 15.1 a starších, seskupování při zápisu nepodporuje zdrojové dotazy, které zahrnují filtry, spojení nebo agregace.
- Úlohy strukturovaného streamování nepodporují clustering při zápisu.
- Ve verzích Databricks Runtime 15.4 LTS a starších nelze vytvořit tabulku s povoleným "liquid clustering" pomocí zápisu v rámci strukturovaného streamování. Pro psaní dat do existující tabulky s povoleným liquid clusteringem můžete použít strukturované streamování.
- Souběžnost na úrovni řádků není u spravovaných tabulek Iceberg podporována, protože u tabulek Iceberg nejsou podporovány vektory odstranění a sledování řádků.