Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Klastrowanie płynne to technika optymalizacji rozmieszczenia danych, która zastępuje partycjonowanie tabel i ZORDER. Upraszcza zarządzanie tabelami i optymalizuje wydajność zapytań, automatycznie organizując dane na podstawie kluczy klastrowania.
W przeciwieństwie do tradycyjnego partycjonowania można ponownie zdefiniować klucze klastrowania bez ponownego zapisywania istniejących danych. Dzięki temu układ danych może ewoluować wraz ze zmieniającymi się potrzebami analitycznymi. Klasyfikacja typu liquid dotyczy zarówno tabel przesyłania strumieniowego, jak i zmaterializowanych widoków.
Ważna
Funkcja Liquid Clustering jest ogólnie dostępna dla tabel Delta Lake w środowisku Databricks Runtime 15.4 LTS i nowszych oraz w publicznej wersji zapoznawczej dla tabel Apache Iceberg w środowisku Databricks Runtime 16.4 LTS i nowszych. Usługa Databricks zaleca używanie najnowszego środowiska Databricks Runtime w celu uzyskania najlepszej wydajności.
Zarządzane tabele Apache Iceberg v3 obsługują również wektory usuwania, śledzenie wierszy, współbieżność na poziomie wiersza i automatyczne klastrowanie cieczy. Te możliwości wymagają środowiska Databricks Runtime w wersji 18.0 lub nowszej. Zobacz Korzystanie z funkcji Apache Iceberg v3.
Kiedy należy używać klastrowania płynnego
Usługa Databricks zaleca płynne klastrowanie dla wszystkich nowych tabel, w tym tabel przesyłania strumieniowego i zmaterializowanych widoków. Następujące scenariusze szczególnie korzystają z klastrowania:
- Zapytania filtrujące kolumny o wysokiej kardynalności.
- Tabele z dużymi niesymetrycznościami danych.
- Szybko powiększające się tabele, które wymagają prac konserwacyjnych i dostrajania.
- Tabele wymagające współbieżnego zapisu.
- Tabele ze zróżnicowanymi lub zmieniającymi się wzorcami dostępu.
- Tabele, w których typowy klucz partycji może zwracać wyniki ze zbyt wielu lub zbyt małej liczby partycji.
Włącz klastrowanie liquid
Klastrowanie płynne można włączyć w istniejącej niepartycyjnej tabeli lub podczas tworzenia tabeli. Klastrowanie nie jest zgodne z partycjonowaniem lub ZORDER. Usługa Databricks zaleca pozostawienie platformie zarządzania wszystkimi operacjami związanymi z przeprowadzaniem układu i optymalizacją danych w tabeli. Po włączeniu funkcji klastrowania dynamicznego uruchom zadania OPTIMIZE w celu przyrostowego klastrowania danych. Zobacz Jak wyzwalać klastrowanie.
Tworzenie tabel z klastrowaniem
Aby włączyć klastrowanie cieczy, dodaj frazę CLUSTER BY do polecenia tworzenia tabeli, jak pokazano w poniższych przykładach. W środowisku Databricks Runtime 14.3 LTS i nowszym można używać interfejsów API DataFrame oraz interfejsu API DeltaTable w językach Python lub Scala do włączania klastrowania płynnego dla tabel Delta Lake.
SQL
Aby utworzyć pustą tabelę z klastrowaniem:
CREATE TABLE table1 (col0 INT, col1 STRING) CLUSTER BY (col0);
Aby utworzyć tabelę na podstawie istniejących danych z klastrowaniem, CLUSTER BY musi zostać wyświetlona po nazwie tabeli, a nie w klauzuli SELECT :
CREATE TABLE table2 CLUSTER BY (col0)
AS SELECT * FROM table1;
Aby skopiować strukturę tabeli, w tym jej konfigurację klastrowania:
CREATE TABLE table3 LIKE table1;
Python
Aby utworzyć pustą tabelę z klastrowaniem przy użyciu interfejsu DeltaTable API:
(DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute())
Aby utworzyć tabelę na podstawie istniejącej ramki danych:
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
Aby utworzyć tabelę przy użyciu interfejsu DataFrameWriterV2 API (dostępnego w środowisku Databricks Runtime 14.2 lub nowszym):
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Scala
Aby utworzyć pustą tabelę z klastrowaniem przy użyciu interfejsu DeltaTable API:
DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute()
Aby utworzyć tabelę na podstawie istniejącej ramki danych:
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
Aby utworzyć tabelę przy użyciu interfejsu DataFrameWriterV2 API (dostępnego w środowisku Databricks Runtime 14.2 lub nowszym):
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Ważna
W przypadku używania interfejsów API DataFrame do ustawiania kluczy grupowania można określić tylko kolumny grupowania podczas tworzenia tabeli lub w trybie overwrite (takich jak przy operacjach CREATE OR REPLACE TABLE). Nie można zmienić kluczy klastrowania w przypadku korzystania z append trybu.
Aby zmienić klucze klastrowania w istniejącej tabeli podczas dołączania danych, użyj poleceń SQL ALTER TABLE , aby zmodyfikować konfigurację klastrowania oddzielnie od operacji zapisu danych. Zobacz Zmienianie kluczy klastrowania.
W środowisku Databricks Runtime 16.4 LTS i nowszych można tworzyć tabele z włączonym klastrowaniem płynnym za pomocą operacji zapisu Structured Streaming, jak pokazano w poniższych przykładach:
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
Tabele Delta Lake z włączonym klastrowaniem cieczowym używają programu zapisującego Delta w wersji 7 i czytnika Delta w wersji 3. Klienci Delta, którzy nie obsługują tych protokołów, nie mogą odczytać tych tabel. Nie można obniżyć wersji protokołu tabeli. Zobacz kompatybilność funkcji i protokoły Delta Lake.
Aby zastąpić domyślne włączanie funkcji, takie jak wektory usuwania, zobacz Zastępowanie domyślnego włączania funkcji (opcjonalnie).
Włącz w istniejących tabelach
Aby włączyć klastrowanie płynne w istniejącej niepartycjonowanej tabeli Delta Lake, wykonaj następujące czynności:
ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)
W przypadku zarządzanych tabel Apache Iceberg należy wziąć pod uwagę następujące kwestie:
- W przypadku tabel ze specyfikacją w wersji 2 należy jawnie wyłączyć wektory usuwania i śledzenie wierszy podczas włączania klastrowania płynnego w istniejącej tabeli.
- W przypadku tabel ze specyfikacją w wersji 3 wyłączenie tych funkcji nie jest wymagane, ponieważ obsługiwane są wektory usuwania i śledzenie wierszy. Zobacz Korzystanie z funkcji Apache Iceberg v3.
Uwaga / Notatka
Domyślne zachowanie nie stosuje klastrowania do wcześniej zapisanych danych. Aby wymusić ponowne klastrowanie, użyj OPTIMIZE FULL lub OPTIMIZE FULL WHERE <predicate>. Zobacz Wymuszanie ponownego klastrowania.
Konwertowanie partycjonowanej tabeli na płynne klastrowanie
W środowisku Databricks Runtime 18.1 lub nowszym, aby przekonwertować istniejącą partycjonowaną tabelę Delta Lake na klastrowanie płynne, użyj elementu REPLACE PARTITIONED BY WITH CLUSTER BY w instrukcji ALTER TABLE. Konwersja minimalizuje przestoje podczas odczytu i zapisu oraz obsługuje zarówno tabele zewnętrzne, jak i tabele zarządzane. Po konwersji tabela umożliwia odczyt w Databricks Runtime w wersji 13.3 LTS lub nowszej.
Uwaga / Notatka
W przypadku zarządzanych tabel góry lodowej konwersja nie jest konieczna, ponieważ te tabele używają definicji partycji jako płynnych kluczy klastrowania. Uruchomienie polecenia konwersji powoduje wystąpienie błędu.
Zalety konwertowania tabel partycjonowanych na klastry płynne obejmują:
- Ulepszenia wydajności tabel dotkniętych nieskutecznym pomijaniem danych lub nadmiernym partycjonowaniem.
- Automatyczne zwiększenie wydajności przy użyciu
CLUSTER BY AUTOw przypadku tabel z często zmieniającymi się wzorcami zapytań. - Kolumny klastrowania są elastyczne i proste do zmiany, natomiast partycjonowanie jest sztywne i trudne do zmiany.
- Mniejsza liczba konfliktów zapisu, ponieważ tabele z klastrowaniem płynnym umożliwiają współbieżność na poziomie wiersza. Zobacz Współbieżność na poziomie wiersza.
Syntax
ALTER TABLE <table_name>
REPLACE PARTITIONED BY WITH CLUSTER BY [( <clustering_columns> ) | AUTO]
Klauzula CLUSTER BY obsługuje następujące opcje:
-
( <clustering_columns> ): określa nowe kolumny klastrowania. Usługa Databricks zaleca przechowywanie nowych kolumn klastrowania podobnych do oryginalnych kolumn partycji. Użycie bardzo różnych kolumn powoduje dużą operację ponownego klastrowania przy pierwszym uruchomieniuOPTIMIZE. -
AUTO: używa bieżących kolumn partycji jako początkowych kolumn klastrowania i pozwala na dostosowanie optymalizacji predykcyjnej w czasie. Dostępne wyłącznie dla tabel zarządzanych w Unity Catalog. Zobacz Automatyczne klastrowanie cieczy. - Nie określono opcji: używa bieżących kolumn partycji jako nowych kolumn klastrowania.
Aby uzyskać wskazówki dotyczące wybierania kluczy klastrowania podczas migracji z partycjonowanych tabel, zobacz Migrowanie z partycjonowania lub Z-order.
Przykłady
Aby klastrować według innych kolumn niż te użyte w oryginalnym partycjonowaniu, na przykład w przypadku tabeli partycjonowanej według (year, month, day), wykonaj następujące czynności:
ALTER TABLE t1 REPLACE PARTITIONED BY WITH CLUSTER BY (day, id);
OPTIMIZE t1;
Uwaga / Notatka
Aby skorzystać ze zmiany kolumn klastrowania, należy uruchomić polecenie OPTIMIZE.
Aby użyć automatycznego klastrowania Liquid Clustering i rozpocząć od bieżących kolumn partycjonowania, wykonaj następujące czynności:
ALTER TABLE t2 REPLACE PARTITIONED BY WITH CLUSTER BY AUTO;
Aby zachować bieżące kolumny partycji jako kolumny klastrowania, wykonaj następujące czynności:
ALTER TABLE t3 REPLACE PARTITIONED BY WITH CLUSTER BY;
Obsługa współbieżnych operacji odczytu i zapisu podczas konwersji
Po konwersji obsługiwane są Databricks Runtime 13.3 LTS i nowsze wersje do odczytu i zapisu. Azure Databricks zaleca użycie środowiska Databricks Runtime 15.4 LTS lub nowszego w przypadku obciążeń odczytujących lub zapisywanych w tabeli podczas konwersji.
W poniższej tabeli przedstawiono sposób obsługi współbieżnych obciążeń odczytu i zapisu podczas konwersji:
| Typ obciążenia | Odczyty w trakcie konwersji | Zapisywanie podczas konwersji |
|---|---|---|
| Batch | Brak przestoju. Wszystkie wersje środowiska Databricks Runtime mogą odczytywać tabelę podczas konwersji. | Brak przestoju w środowisku Databricks Runtime 15.4 lub nowszym. W przypadku środowiska Databricks Runtime 15.3 lub starszego usługa Databricks zaleca wstrzymanie obciążeń przed przekonwertowaniem, a następnie ponowne uruchomienie obciążeń po zakończeniu konwersji. |
| Streaming |
W przypadku śledzenia schematu i mapowania kolumn: uruchom ponownie strumień bez utraty zatwierdzeń. Bez śledzenia schematu i mapowania kolumn: strumień zgłasza wyjątek. Uruchom ponownie przy użyciu nowej lokalizacji punktu kontrolnego i wersji początkowej. Zatwierdzenia nie są tracone. |
Uruchom ponownie strumień bez utraty commitów. |
Weryfikowanie lub wycofywanie konwersji
Aby potwierdzić konwersję, uruchom polecenie DESCRIBE EXTENDED , aby wyświetlić nowe kolumny klastrowania. Uruchom polecenie DESCRIBE HISTORY , aby wyświetlić serię REORG operacji, UPGRADE PROTOCOL operacji i REPLACE PARTITIONED BY WITH CLUSTER BY operacji.
Aby wycofać konwersję, użyj polecenia RESTORE , aby powrócić do poprzedniej wersji. Alternatywnie możesz ponownie napisać tabelę przy użyciu polecenia REPLACE TABLE ... PARTITIONED BY (...) AS SELECT * FROM ....
Aby przeprowadzić wycofanie za pomocą RESTORE, uruchom następujące polecenia:
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>;
Zobacz: RESTORE.
Konwertowanie tabeli partycjonowanej według kolumny znacznika czasu
Aby przekonwertować tabelę (t1) podzieloną na partycje według kolumny znacznika czasu (timestamp_col) i użyć kolumny znacznika czasu jako klucza klastrowania, należy ustawić dodatkowe konfiguracje:
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;
Jeśli spróbujesz przekonwertować kolumnę partycjonowania typu timestamp na kolumnę klastrowania bez tych konfiguracji, polecenie zgłosi błąd:
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
Ograniczenia konwersji
Następujące ograniczenia dotyczą REPLACE PARTITIONED BY WITH CLUSTER BY polecenia konwersji:
- Tabele strumieniowe i widoki zmaterializowane utworzone w potokach Lakeflow nie są obsługiwane. Aby użyć klastrowania płynnego, należy zaktualizować definicję potoku tak, aby używała
CLUSTER BYzamiastPARTITIONED BY. - Tabele korzystające z Delta Sharing z filtrowaniem partycji nie są obsługiwane. Aby uzyskać informacje o filtrowaniu partycji w usłudze Delta Sharing, zobacz Określ partycje tabeli do udostępnienia.
Usuwanie kluczy klastrowania
Aby usunąć klucze klastrowania, użyj następującej składni:
ALTER TABLE table_name CLUSTER BY NONE;
Wybieranie kluczy klastrowania
Wybierz klucze klastrowania na podstawie kolumn najczęściej używanych w filtrach zapytań. Odpowiednie klucze znacznie zwiększają wydajność pomijania danych i wykonywania zapytań.
Wskazówka
Databricks zaleca korzystanie z automatycznego klastrowania Liquid, aby inteligentnie dobierać klucze klastrowania na podstawie wzorców wykonywanych zapytań. Zobacz Automatyczne klastrowanie cieczy.
Kluczowe wskazówki dotyczące wyboru
Podczas ręcznego określania kluczy klastrowania wybierz kolumny na podstawie kolumn najczęściej używanych w filtrach zapytań. Klucze klastrowania można zdefiniować w dowolnej kolejności. Jeśli dwie kolumny są wysoce skorelowane, wystarczy dołączyć tylko jedną z nich jako klucz klastrowania.
Można określić maksymalnie cztery klucze klastrowania. W przypadku mniejszych tabel (mniej niż 10 TB) użycie większej liczby kluczy klastrowania może obniżyć wydajność podczas filtrowania w jednej kolumnie. Na przykład filtrowanie z czterema kluczami działa gorzej niż filtrowanie przy użyciu dwóch kluczy. Jednak wraz ze wzrostem rozmiaru tabeli ta różnica w wydajności staje się nieznaczna w przypadku zapytań jednokolumnachowych.
Klucze klastrowania muszą być kolumnami, dla których zebrano statystyki. Domyślnie tabele usługi Delta Lake zbierają statystyki dla pierwszych 32 kolumn. Zobacz Określanie kolumn statystyk.
Obsługiwane typy danych
Klastrowanie obsługuje następujące typy danych dla kluczy klastrowania:
- Date
- Sygnatura czasowa
- TimestampNTZ (Databricks Runtime 14.3 LTS lub nowsze)
- Sznurek
- Liczba całkowita, długa, krótka, bajtowa
- Float (Liczba zmiennoprzecinkowa), Double (Podwójna precyzja), Decimal (Liczba dziesiętna)
Można grupować według elementu StructField za pomocą notacji kropkowej, na przykład CLUSTER BY (struct_col.field). Zagnieżdżone pola struktury są obsługiwane dla dowolnej głębokości, takiej jak CLUSTER BY (struct_col.nested.field). Typ danych pola musi być jednym z obsługiwanych typów na powyższej liście.
Nie można klasterować według dowolnego z następujących elementów:
- Typy złożone, takie jak
StructType,MapTypelubArrayType -
MapTypeiArrayTypeelementy, takie jakmap_col['key'],array_col[0]lubmap_col.key.
Migrowanie z partycjonowania lub kolejności Z
Ważna
Databricks zaleca korzystanie z automatycznej konwersji za pomocą polecenia REPLACE PARTITIONED BY WITH CLUSTER BY. Zobacz Konwertowanie partycjonowanej tabeli na płynne klastrowanie.
Jeśli konwertujesz istniejącą tabelę, rozważ następujące zalecenia:
| Bieżąca technika optymalizacji danych | Zalecenie dotyczące kluczy klastrowania |
|---|---|
| Partycjonowanie w stylu Hive | Użyj kolumn partycji jako kluczy klastrowania. |
| Indeksowanie porządku Z |
ZORDER BY Użyj kolumn jako kluczy klastrowania. |
| Partycjonowanie w stylu Hive i porządek Z | Użyj zarówno kolumn partycji, jak i ZORDER BY kolumn jako kluczy klastrowania. |
| Wygenerowane kolumny w celu zmniejszenia kardynalności (na przykład daty dla znacznika czasu) | Użyj oryginalnej kolumny jako klucza klastrowania i nie twórz wygenerowanej kolumny. |
automatyczne klastrowanie cieczy
W środowiskach Databricks Runtime 15.4 LTS i nowszych można włączyć automatyczne klastrowanie Liquid dla zarządzanych tabel Delta Lake w Unity Catalog. W przypadku zarządzanych przez Unity Catalog tabel Apache Iceberg v3 automatyczne klastrowanie płynne wymaga środowiska Databricks Runtime 18.0 i nowszych. Automatyczne klastrowanie płynne umożliwia usłudze Azure Databricks inteligentne wybieranie kluczy klastrowania, aby zoptymalizować wydajność zapytań przy użyciu klauzuli CLUSTER BY AUTO.
Uwaga / Notatka
Automatyczne klastrowanie Liquid jest także obsługiwane dla zmaterializowanych widoków i tabel strumieniowych, w tym potoków Lakeflow i samodzielnych potoków. Określ CLUSTER BY AUTO w pipeline lub definicji SQL.
Jak działa automatyczne grupowanie cieczy
Automatyczne klastrowanie Liquid wymaga optymalizacji predykcyjnej do automatycznego doboru kluczy i wykonywania operacji klastrowania oraz działa asynchronicznie. Zobacz Optymalizację predykcyjną dla tabel zarządzanych w Unity Catalog.
Automatyczne klastrowanie danych ciekłych wykorzystuje inteligentne optymalizacje na podstawie wzorców użytkowania:
- Analizuje obciążenie zapytań: usługa Azure Databricks analizuje historyczne obciążenie zapytania tabeli i identyfikuje najlepsze kolumny kandydatów do klastrowania.
- Dostosowuje się do zmian: jeśli wzorce zapytań lub dystrybucje danych zmieniają się w czasie, automatyczne klastrowanie liquid wybiera nowe klucze w celu optymalizacji wydajności.
- Wybór świadomy kosztów: Usługa Azure Databricks zmienia klucze klastrowania tylko wtedy, gdy przewidywane oszczędności kosztów wynikające z ulepszeń pomijania danych przewyższają koszt klastrowania danych.
Automatyczne klastrowanie cieczy może nie wybierać kluczy z następujących powodów:
- Tabela jest zbyt mała, aby skorzystać z klastrowania płynnego.
- Tabela ma już skuteczny schemat klastrowania z poprzednich kluczy ręcznych lub naturalnej kolejności wstawiania, która pasuje do wzorców zapytań.
- W tej tabeli nie ma często wykonywanych zapytań.
- Nie używasz środowiska Databricks Runtime 15.4 LTS lub nowszego.
Można zastosować automatyczne klastrowanie danych dla wszystkich tabel zarządzanych przez Unity Catalog, niezależnie od cech danych i zapytań. Heurystyka decyduje, czy wybór kluczy klastrowania jest opłacalny.
Zgodność wersji środowiska Databricks Runtime
Można odczytywać lub zapisywać tabele z włączonym automatycznym klastrowaniem we wszystkich wersjach środowiska Databricks Runtime, które obsługują płynne klastrowanie (liquid clustering). Jednak wybór klucza inteligentnego zależy od metadanych wprowadzonych w środowisku Databricks Runtime 15.4 LTS.
Użyj środowiska Databricks Runtime 15.4 LTS lub nowszego, aby zapewnić, że automatycznie wybrane klucze optymalizują działanie wszystkich obciążeń i że te obciążenia są uwzględniane przy wyborze nowych kluczy.
Włączanie lub wyłączanie automatycznego klastrowania cieczy
SQL
Aby utworzyć tabelę z automatycznym klastrowaniem liquid:
CREATE OR REPLACE TABLE table1 (column01 int, column02 string) CLUSTER BY AUTO;
Aby włączyć automatyczne klastrowanie liquid w istniejącej tabeli, w tym tabele z ręcznie określonymi kluczami:
ALTER TABLE table1 CLUSTER BY AUTO;
Aby ustawić początkowe wskazówki dotyczące kolumn klastrowania dla wyboru klucza, ustaw klucze klastrowania, a następnie włącz automatyczne klastrowanie:
ALTER TABLE table1 CLUSTER BY (c1, c2);
ALTER TABLE table1 CLUSTER BY AUTO;
Alternatywnie użyj interfejsu API Python, aby ustawić wskazówki w ramach jednej operacji.
Aby wyłączyć automatyczne grupowanie cieczy:
ALTER TABLE table1 CLUSTER BY NONE;
Aby wyłączyć automatyczne klastrowanie Liquid i określić kolumny klastrowania:
ALTER TABLE table1 CLUSTER BY (column01, column02);
Jeśli istniejąca tabela ma włączone automatyczne klastrowanie Liquid, uruchomienie CREATE OR REPLACE table_name bez CLUSTER BY AUTO wyłącza automatyczne klastrowanie i nie zachowuje kolumn klastrowania. Aby zachować automatyczne klastrowanie cieczy i wszelkie wcześniej wybrane kolumny, uwzględnij CLUSTER BY AUTO w instrukcji replace. Dzięki CLUSTER BY AUTOfunkcji optymalizacja predykcyjna używa historycznego obciążenia zapytań dla tabeli w celu zidentyfikowania najlepszych kluczy klastrowania.
Python
Interfejs API języka Python jest dostępny w środowisku Databricks Runtime 16.4 lub nowszym. Można użyć Python tylko podczas tworzenia lub zastępowania tabeli. Użyj programu SQL, aby zmienić clusterByAuto stan istniejącej tabeli.
Aby utworzyć tabelę z automatycznym klastrowaniem cieczy przy użyciu DataFrameWriter:
df = spark.read.table("table1")
df.write
.format("delta")
.option("clusterByAuto", "true")
.saveAsTable(...)
Aby ustawić początkowe podpowiedzi dotyczące kolumn klastrowania przy wyborze klucza przy użyciu DataFrameWriter:
df.write
.format("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option("clusterByAuto", "true")
.saveAsTable(...)
Aby utworzyć tabelę z automatycznym klastrowaniem cieczy przy użyciu DataFrameWriterV2:
df.writeTo(...).using("delta")
.option("clusterByAuto", "true")
.create()
Aby ustawić początkowe podpowiedzi dotyczące kolumn klastrowania przy wyborze klucza przy użyciu DataFrameWriterV2:
df.writeTo(...).using("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option("clusterByAuto", "true")
.create()
Aby utworzyć tabelę strumieniową z automatycznym klastrowaniem Liquid:
spark.readStream.table("source_table")
.writeStream
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
Aby ustawić początkowe podpowiedzi dotyczące kolumn grupowania na potrzeby wyboru klucza w tabeli strumieniowej:
spark.readStream.table("source_table")
.writeStream
.clusterBy("column1", "column2")
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
Gdy używasz .clusterBy jako wskazówek dotyczących wyboru klucza klastra wraz z elementem .option('clusterByAuto', 'true'), zachowanie jest następujące:
- Jeśli ta operacja po raz pierwszy ustawia automatyczne grupowanie Liquid, kolumny grupowania są ustawiane na kolumny określone w elemencie
.clusterBy. - Jeśli jest to istniejąca tabela z włączonym automatycznym klastrowaniem typu liquid, wskazówka
.clusterByjest przyjmowana tylko raz. Na przykład kolumny określone przez.clusterBysą ustawiane tylko wtedy, gdy tabela nie ma ustawionych kolumn klastrowania.
Ważna
W przypadku korzystania z interfejsów API ramki danych, opcję można ustawić tylko wtedy, gdy używany jest tryb clusterByAuto. Nie można ustawić clusterByAuto w przypadku korzystania z append trybu. To ograniczenie jest takie samo, jak w przypadku ręcznego ustawiania kolumn klastrowania. Ustawienia klastrowania można skonfigurować tylko podczas tworzenia tabeli lub operacji zastępowania przy użyciu overwrite trybu.
Aby obejść ten problem, jeśli chcesz zmienić clusterByAuto stan istniejącej tabeli podczas dołączania danych, użyj poleceń SQL ALTER TABLE , aby zmodyfikować konfigurację klastrowania oddzielnie od operacji zapisu danych.
Sprawdzanie, czy automatyczne klastrowanie jest włączone
Aby sprawdzić, czy tabela ma włączone automatyczne klastrowanie płynne, użyj polecenia DESCRIBE TABLE lub SHOW TBLPROPERTIES.
Jeśli włączono automatyczne klastrowanie cieczy, właściwość jest ustawiana na wartość clusterByAuto. Właściwość clusteringColumns pokazuje bieżące kolumny klastrowania, które zostały automatycznie lub ręcznie wybrane.
Limitations
Automatyczne klastrowanie cieczy nie jest dostępne dla zarządzanych tabel Apache Iceberg v2. Jest ona obsługiwana w przypadku zarządzanych tabel Apache Iceberg w wersji 3 w środowisku Databricks Runtime 18.0 lub nowszym.
Zapisywanie danych w tabeli klastrowanej
Aby zapisywać dane do tabeli Delta Lake korzystającej z klastrowania, należy używać klienta zapisu Delta, który obsługuje wszystkie funkcje tabeli protokołu zapisu Delta używane przez mechanizm liquid clustering. Aby zapisać w klastrowanej tabeli Iceberg, możesz użyć interfejsu API Unity Catalog's Iceberg REST Catalog. W usłudze Azure Databricks musisz użyć środowiska Databricks Runtime 13.3 LTS lub nowszego.
Operacje wspierające klastrowanie podczas zapisu
Operacje zgrupowane wokół zapisu obejmują:
- Operacje
INSERT INTO -
CTASiRTASinstrukcje -
COPY INTOz formatu Parquet spark.write.mode("append")
Progi rozmiaru dla klastrowania
Klastrowanie podczas zapisu jest wyzwalane tylko wtedy, gdy dane w transakcji spełniają próg rozmiaru. Te progi różnią się w zależności od liczby kolumn użytych do klastrowania i są niższe w przypadku tabel zarządzanych przez Unity Catalog niż w przypadku innych tabel Delta Lake.
| Liczba kolumn klastrowania | Próg rozmiaru tabel zarządzanych w Katalogu Unity | Próg rozmiaru dla innych tabel Delta Lake |
|---|---|---|
| 1 | 64 MB | 256 MB |
| 2 | 256 MB | 1 GB |
| 3 | 512 MB | 2 GB |
| 4 | 1 GB | 4 GB |
Ponieważ nie wszystkie operacje stosują "liquid clustering", Databricks zaleca częste uruchamianie OPTIMIZE, aby zapewnić efektywne klastrowanie wszystkich danych.
Obciążenia przesyłane strumieniowo
Obciążenia przesyłania strumieniowego ze strukturą obsługują klastrowanie przy zapisie, gdy konfiguracja platformy Spark jest ustawiona na spark.databricks.delta.liquid.eagerClustering.streaming.enabled. Klastrowanie dla tych obciążeń jest wyzwalane tylko wtedy, gdy co najmniej jedna z pięciu ostatnich aktualizacji przesyłania strumieniowego przekracza próg rozmiaru z powyższej tabeli.
Jak wyzwalać klastrowanie
** Optymalizacja predykcyjna automatycznie uruchamia OPTIMIZE polecenia dla włączonych tabel. Zobacz Optymalizację predykcyjną dla tabel zarządzanych w Unity Catalog. Korzystając z optymalizacji predykcyjnej, usługa Databricks zaleca wyłączenie zaplanowanych OPTIMIZE zadań.
Aby uruchomić klastrowanie, należy użyć Databricks Runtime w wersji 13.3 LTS lub nowszej. Databricks zaleca korzystanie z Databricks Runtime w wersji 17.3 LTS lub nowszej, aby zwiększyć wydajność OPTIMIZE w przypadku dużych tabel. Użyj polecenia OPTIMIZE na swojej tabeli.
OPTIMIZE table_name;
Klastrowanie Liquid jest przyrostowe, co oznacza, że OPTIMIZE dane są przepisywane tylko wtedy, gdy jest to konieczne do uwzględnienia danych wymagających klastrowania.
OPTIMIZE program nie zapisuje ponownie plików danych przy użyciu kluczy klastrowania, które nie są zgodne z danymi klastra. Zobacz Wymuszanie ponownego klastrowania.
Jeśli nie używasz optymalizacji predykcyjnej, Databricks zaleca regularne uruchamianie zadań OPTIMIZE w celu grupowania danych. Dla tabel, które często są aktualizowane lub podlegają operacjom wstawiania, Databricks zaleca, aby zaplanować OPTIMIZE zadanie co jedną lub dwie godziny. Ponieważ klastrowanie płynów jest przyrostowe, większość zadań dla tabel klastrowanych jest uruchamiana szybko.
Wymuszanie ponownego klastryfikowania
W środowisku Databricks Runtime 16.4 LTS i nowszym można wymusić ponowne rejestrowanie wszystkich rekordów w tabeli przy użyciu następującej składni:
OPTIMIZE table_name FULL;
Ważna
Uruchamianie OPTIMIZE FULL ponownie grupuje wszystkie istniejące dane zgodnie z potrzebami. W przypadku dużych tabel, które nie zostały wcześniej klastrowane na określonych kluczach, ta operacja może potrwać kilka godzin.
Uruchom OPTIMIZE FULL po włączeniu klastrowania po raz pierwszy lub zmianie kluczy klastrowania. Jeśli wcześniej uruchomiono OPTIMIZE FULL i nie nastąpiła zmiana kluczy klastrowania, OPTIMIZE FULL działa tak samo jak OPTIMIZE. W tym scenariuszu OPTIMIZE zastosowano podejście przyrostowe i przepisuje tylko te pliki, które nie zostały jeszcze skompaktowane. Zawsze używaj OPTIMIZE FULL, aby upewnić się, że układ danych odzwierciedla bieżące klucze klastrowania.
Częściowa rekonfiguracja klastrów
W środowisku Databricks Runtime 18.1 lub nowszym można wymusić ponowne tworzenie podzbioru rekordów przy użyciu polecenia OPTIMIZE FULL WHERE <predicate>. Plik jest dołączany, jeśli jakakolwiek część jego zakresu nakłada się na predykat. Zobacz Parametry.
OPTIMIZE events FULL WHERE event_date >= '2025-01-01';
Odczytywanie danych z tabeli klastrowanej
Dane można odczytywać w klastrowanej tabeli usługi Delta Lake przy użyciu dowolnego klienta usługi Delta Lake, który obsługuje odczytywanie wektorów usuwania. Za pomocą interfejsu API katalogu REST Iceberg można odczytywać dane w klastrowanej tabeli Iceberg. Klastrowanie Liquid poprawia wydajność zapytań dzięki automatycznemu pomijaniu danych podczas filtrowania kluczy klastrowania.
SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";
Zarządzanie kluczami klastrowania
Zobacz, jak tabela jest klastrowana
Możesz użyć DESCRIBE poleceń, aby wyświetlić klucze klastrowania dla tabeli, jak w następujących przykładach:
DESCRIBE TABLE table_name;
DESCRIBE DETAIL table_name;
Zmienianie kluczy klastrowania
Klucze klastrowania dla tabeli można zmienić w dowolnym momencie, uruchamiając ALTER TABLE polecenie, jak w poniższym przykładzie:
ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);
W przypadku zmiany kluczy klastrowania, kolejne operacje OPTIMIZE i zapisu używają nowego podejścia do klastrowania, ale istniejące dane nie zostaną przepisane. Aby ponownie napisać istniejące dane za pomocą zaktualizowanych kluczy klastrowania, zobacz Wymuszanie ponownego zapisywania.
Klastrowanie można również wyłączyć, ustawiając klucze na NONE, jak w poniższym przykładzie:
ALTER TABLE table_name CLUSTER BY NONE;
Ustawianie kluczy klastra na NONE nie powoduje ponownego zapisywania danych klastrowanych, ale uniemożliwia wykonywanie przyszłych OPTIMIZE operacji przy użyciu kluczy klastrowania.
Użycie klastrowania cieczy z zewnętrznego silnika
Można włączyć liquid clustering w zarządzanych tabelach Iceberg z zewnętrznych silników Iceberg. Aby włączyć klastrowanie cieczy, określ kolumny partycji przy tworzeniu tabeli. Katalog Unity interpretuje partycje jako klucze klastrowania. Na przykład uruchom poniższe polecenie w OSS Spark.
CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY c1;
Aby wyłączyć klastrowanie płynne:
ALTER TABLE main.schema.icebergTable DROP PARTITION FIELD c2;
Aby zmienić klucze grupowania przy użyciu ewolucji partycji w Iceberg:
ALTER TABLE main.schema.icebergTable ADD PARTITION FIELD c2;
Jeśli określisz partycję przy użyciu przekształcenia koszyka, Unity Catalog pomija wyrażenie i kolumna jest używana jako klucz klastrowania.
CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY (bucket(c1, 10));
Zgodność tabel z klastrowaniem płynnym
Klastrowanie Liquid korzysta z funkcji tabel usługi Delta Lake, które wymagają określonych wersji środowiska Databricks Runtime do odczytu i zapisu. Tabele utworzone przy użyciu płynnego klastrowania w środowisku Databricks Runtime 14.3 LTS i nowszym używają domyślnie punktu kontrolnego V2. Tabele można odczytywać i zapisywać przy użyciu punktu kontrolnego V2 w środowisku Databricks Runtime 13.3 LTS lub nowszym. Zobacz Punkt kontrolny V2.
Aby obsługiwać czytelników przy użyciu środowiska Databricks Runtime od wersji 12.2 LTS do 13.2, wyłącz checkpoint V2 i obniż protokół tabeli. Zobacz Obniżanie do wersji klasycznej.
Zastąpij domyślne włączanie funkcji (opcjonalnie)
Podczas włączania klastrowania płynnego można zastąpić domyślne włączanie funkcji tabeli usługi Delta Lake. Uniemożliwia to uaktualnienie protokołów czytników i protokołów zapisu skojarzonych z tymi cechami tabeli. Aby wykonać następujące czynności, musisz mieć istniejącą tabelę:
Użyj
ALTER TABLE, aby ustawić właściwość tabeli, która wyłącza jedną lub więcej funkcji. Aby na przykład wyłączyć wektory usuwania, uruchom następujące polecenie:ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);Włącz klastrowanie płynów w tabeli, uruchamiając następujące polecenie:
ALTER TABLE <table_name> CLUSTER BY (<clustering_columns>)
Poniższa tabela zawiera informacje na temat funkcji delta, które można zastąpić i jak włączenie wpływa na zgodność z wersjami środowiska Databricks Runtime:
| Funkcja delta | Zgodność środowiska uruchomieniowego | Właściwość do nadpisywania włączenia | Wpływ na klastrowanie cieczy po wyłączeniu |
|---|---|---|---|
| Wektory usuwania | Operacje odczytu i zapisu wymagają środowiska Databricks Runtime 12.2 LTS lub nowszego. | 'delta.enableDeletionVectors' = false |
Wyłączenie wektorów usuwania powoduje również wyłączenie współbieżności na poziomie wiersza, co powoduje, że transakcje i operacje klastrowania będą bardziej narażone na konflikt. Zobacz Współbieżność na poziomie wiersza.DELETE, MERGE i UPDATE polecenia mogą działać wolniej. |
| Śledzenie rzędów | Zapisy wymagają środowiska Databricks Runtime 13.3 LTS lub nowszego. Można odczytywać z dowolnej wersji środowiska Databricks Runtime. | 'delta.enableRowTracking' = false |
Wyłączenie śledzenia wierszy powoduje również wyłączenie współbieżności na poziomie wiersza, co powoduje, że transakcje i operacje klastrowania będą bardziej narażone na konflikt. Zobacz Współbieżność na poziomie wiersza. |
| Punkt kontrolny V2 | Operacje odczytu i zapisu wymagają środowiska Databricks Runtime 13.3 LTS lub nowszego. | 'delta.checkpointPolicy' = 'classic' |
Brak wpływu na zachowanie klastrowania cieczy. Zobacz Punkt kontrolny V2. |
Limitations
- Środowisko Databricks Runtime 15.1 i wcześniejsze: przy klastrowaniu podczas zapisu nie są obsługiwane zapytania źródłowe, które zawierają filtry, sprzężenia lub agregacje.
- Databricks Runtime 15.4 LTS i poniżej: nie można utworzyć tabeli z włączonym klastrowaniem płynnym przy użyciu zapisu w ramach Structured Streaming. Można używać strumieniowego przetwarzania danych ze strukturą do zapisywania danych w istniejącej tabeli z włączonym klastrowaniem płynnym.
-
Apache Iceberg v2: Współbieżność na poziomie wiersza nie jest obsługiwana w zarządzanych tabelach Apache Iceberg v2, ponieważ wektory usuwania i śledzenie wierszy nie są obsługiwane.
- Współbieżność na poziomie wiersza jest obsługiwana w zarządzanych tabelach Apache Iceberg v3, ponieważ specyfikacja v3 obsługuje wektory usuwania i śledzenie wierszy. Zobacz Korzystanie z funkcji Apache Iceberg v3.