Używanie płynnego klastrowania dla tabel delty
Klaster liquid usługi Delta Lake zastępuje partycjonowanie tabel i ZORDER
upraszcza decyzje dotyczące układu danych i optymalizuje wydajność zapytań. Płynne klastrowanie zapewnia elastyczność w zakresie redefiniowania kluczy klastrowania bez konieczności przepisywania istniejących danych, umożliwiając ewolucję układu danych wraz z potrzebami analitycznymi w czasie.
Ważne
Usługa Databricks zaleca używanie środowiska Databricks Runtime 15.2 lub nowszego dla wszystkich tabel z włączonym klastrowaniem płynnym. Publiczna wersja zapoznawcza z ograniczeniami jest dostępna w środowisku Databricks Runtime 13.3 LTS i nowszym.
Uwaga
Tabele z włączonym klastrowaniem płynnym obsługują współbieżność na poziomie wiersza w środowisku Databricks Runtime 13.3 LTS lub nowszym. Współbieżność na poziomie wiersza jest ogólnie dostępna w środowisku Databricks Runtime 14.2 lub nowszym dla wszystkich tabel z włączonymi wektorami usuwania. Zobacz Poziomy izolacji i konflikty zapisu w usłudze Azure Databricks.
Do czego służy klastrowanie płynne?
Usługa Databricks zaleca płynne klastrowanie dla wszystkich nowych tabel delty. Poniżej przedstawiono przykłady scenariuszy, które korzystają z klastrowania:
- Tabele często filtrowane według kolumn o wysokiej kardynalności.
- Tabele ze znaczną niesymetrycznością w dystrybucji danych.
- Tabele, które szybko rosną i wymagają prac konserwacyjnych i dostrajania.
- Tabele z wymaganiami dotyczącymi współbieżnego zapisu.
- Tabele ze wzorcami dostępu, które zmieniają się w czasie.
- Tabele, w których typowy klucz partycji może pozostawić tabelę z zbyt wieloma lub zbyt kilkoma partycjami.
Włączanie klastrowania liquid
Klastrowanie płynne można włączyć w istniejącej tabeli lub podczas tworzenia tabeli. Klastrowanie nie jest zgodne z partycjonowaniem lub ZORDER
, i wymaga użycia usługi Azure Databricks do zarządzania wszystkimi operacjami układu i optymalizacji dla danych w tabeli. Po włączeniu klastrowania płynnego uruchom OPTIMIZE
zadania tak jak zwykle, aby przyrostowo dane klastra. Zobacz Jak wyzwalać klastrowanie.
Aby włączyć klastrowanie liquid, dodaj frazę CLUSTER BY
do instrukcji tworzenia tabeli, jak w poniższych przykładach:
Uwaga
W środowisku Databricks Runtime 14.2 lub nowszym można użyć interfejsów API ramki danych i interfejsu API funkcji DeltaTable w języku Python lub Scala, aby umożliwić klastrowanie cieczy.
SQL
-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) CLUSTER BY (col0);
-- Using a CTAS statement
CREATE EXTERNAL TABLE table2 CLUSTER BY (col0) -- specify clustering after table name, not in subquery
LOCATION 'table_location'
AS SELECT * FROM table1;
-- Using a LIKE statement to copy configurations
CREATE TABLE table3 LIKE table1;
Python
# Create an empty table
(DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute())
# Using a CTAS statement
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
# CTAS using DataFrameWriterV2
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Scala
// Create an empty table
DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute()
// Using a CTAS statement
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
// CTAS using DataFrameWriterV2
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Ostrzeżenie
Tabele utworzone z włączonym klastrowaniem płynnym mają wiele funkcji tabeli delta włączoną podczas tworzenia i używania składnika zapisywania różnicowego w wersji 7 i czytnika w wersji 3. Możesz zastąpić włączenie niektórych z tych funkcji. Zobacz Zastępowanie domyślnej funkcji włączania (opcjonalnie).
Nie można obniżyć wersji protokołu tabel, a tabele z włączonym klastrowaniem nie są czytelne dla klientów usługi Delta Lake, które nie obsługują wszystkich funkcji tabel protokołu czytnika różnicowego. Zobacz artykuł Jak usługa Azure Databricks zarządza zgodnością funkcji usługi Delta Lake?.
Klaster płynny można włączyć w istniejącej niepartycyjnej tabeli delty przy użyciu następującej składni:
ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)
Zastąpij domyślne włączanie funkcji (opcjonalnie)
Można zastąpić domyślne zachowanie, które włącza funkcje tabeli delta podczas włączania klastrowania płynnego. Uniemożliwia to uaktualnianie protokołów czytników i składników zapisywania skojarzonych z tymi funkcjami tabeli. Aby wykonać następujące czynności, musisz mieć istniejącą tabelę:
Służy
ALTER TABLE
do ustawiania właściwości tabeli, która wyłącza co najmniej jedną funkcję. 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 liquid 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 ma wpływ na zgodność z wersjami środowiska Databricks Runtime.
Funkcja delta | Zgodność środowiska uruchomieniowego | Właściwość do zastąpienia włączania | Wpływ wyłączenia na klastrowanie płynne |
---|---|---|---|
Wektory usuwania | Operacje odczytu i zapisu wymagają usługi Databricks Runtime 12.2 lTS i nowszych. | 'delta.enableDeletionVectors' = false |
Współbieżność na poziomie wiersza jest wyłączona, co zwiększa prawdopodobieństwo konfliktu transakcji i operacji klastrowania. Zobacz Konflikty zapisu ze współbieżnością na poziomie wiersza.DELETE polecenia , MERGE i UPDATE mogą działać wolniej. |
Śledzenie wierszy | Zapisy wymagają środowiska Databricks Runtime 13.3 LTS lub nowszego. Można odczytywać z dowolnej wersji środowiska Databricks Runtime. | 'delta.enableRowTracking' = false |
Współbieżność na poziomie wiersza jest wyłączona, co zwiększa prawdopodobieństwo konfliktu transakcji i operacji klastrowania. Zobacz Konflikty zapisu ze współbieżnością na poziomie wiersza. |
Punkty kontrolne w wersji 2 | Operacje odczytu i zapisu wymagają środowiska Databricks Runtime 13.3 LTS lub nowszego. | 'delta.checkpointPolicy' = 'classic' |
Brak wpływu na zachowanie klastrowania cieczy. |
Wybieranie kluczy klastrowania
Usługa Databricks zaleca wybranie kluczy klastrowania na podstawie często używanych filtrów zapytań. Klucze klastrowania można zdefiniować w dowolnej kolejności. Jeśli dwie kolumny są skorelowane, wystarczy dodać jedną z nich jako klucz klastrowania.
Możesz określić do 4 kolumn jako kluczy klastrowania. Możesz określić tylko kolumny ze statystykami zebranymi dla kluczy klastrowania. Domyślnie pierwsze 32 kolumny w tabeli Delta mają zebrane statystyki. Zobacz Określanie kolumn statystyk różnicowych.
Klaster obsługuje następujące typy danych dla kluczy klastrowania:
- Data
- Sygnatura czasowa
- TimestampNTZ (wymaga środowiska Databricks Runtime 14.3 LTS lub nowszego)
- String
- Liczba całkowita
- Długi
- Krótkie
- Liczba zmiennoprzecinkowa
- Liczba rzeczywista
- Dziesiętne
- Byte
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 kolejności Z | ZORDER BY Użyj kolumn jako kluczy klastrowania. |
Partycjonowanie w stylu hive i kolejność Z | Użyj kolumn partycji 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. |
Zapisywanie danych w tabeli klastrowanej
Należy użyć klienta modułu zapisywania różnicowego, który obsługuje wszystkie funkcje tabeli protokołu zapisu różnicowego używane przez klastrowanie liquid. W usłudze Azure Databricks musisz użyć środowiska Databricks Runtime 13.3 LTS lub nowszego.
Operacje klastra w zapisie obejmują następujące elementy:
- Operacje:
INSERT INTO
CTAS
instrukcje iRTAS
COPY INTO
z formatu Parquetspark.write.mode("append")
Zapisy przesyłania strumieniowego ze strukturą nigdy nie wyzwalają klastrowania na zapisie. Obowiązują dodatkowe ograniczenia. Zobacz Ograniczenia.
Klastrowanie na zapisie 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 klastrowania i są niższe dla tabel zarządzanych przez wykaz aparatu Unity niż inne tabele delty.
Liczba kolumn klastrowania | Rozmiar progu dla tabel zarządzanych w wykazie aparatu Unity | Rozmiar progu dla innych tabel delty |
---|---|---|
1 | 64 MB | 256 MB |
2 | 256 MB | 1 GB |
3 | 512 MB | 2 GB |
100 | 1 GB | 4 GB |
Ponieważ nie wszystkie operacje stosują klastrowanie liquid, usługa Databricks zaleca częste uruchamianie OPTIMIZE
w celu zapewnienia efektywnego klastrowania wszystkich danych.
Jak wyzwalać klastrowanie
Optymalizacja predykcyjna automatycznie uruchamia OPTIMIZE
polecenia dla tabel z obsługą. Zobacz Optymalizacja predykcyjna dla tabel zarządzanych w wykazie aparatu Unity.
Aby wyzwolić klastrowanie, należy użyć środowiska Databricks Runtime 13.3 LTS lub nowszego. OPTIMIZE
Użyj polecenia w tabeli, jak w poniższym przykładzie:
OPTIMIZE table_name;
Klastrowanie liquid jest przyrostowe, co oznacza, że dane są ponownie zapisywane tylko w razie potrzeby, aby uwzględnić dane, które muszą być klastrowane. Pliki danych z kluczami klastrowania, które nie pasują do danych, które mają być klastrowane, nie są przepisane.
Aby uzyskać najlepszą wydajność, usługa Databricks zaleca planowanie regularnych OPTIMIZE
zadań do danych klastra. W przypadku tabel, w których występuje wiele aktualizacji lub wstawiania, usługa Databricks zaleca zaplanowanie OPTIMIZE
zadania co jedną lub dwie godziny. Ponieważ klastrowanie liquid jest przyrostowe, większość OPTIMIZE
zadań dla tabel klastrowanych jest szybko uruchamiana.
Odczytywanie danych z tabeli klastrowanej
Dane w tabeli klastrowanej można odczytywać przy użyciu dowolnego klienta usługi Delta Lake obsługującego odczytywanie wektorów usuwania. Aby uzyskać najlepsze wyniki zapytań, uwzględnij klucze klastrowania w filtrach zapytań, jak w poniższym przykładzie:
SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";
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 OPTIMIZE
operacje zapisu używają nowego podejścia do klastrowania, ale istniejące dane nie zostaną przepisane.
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;
Ustawienie kluczy klastra na NONE
nie powoduje ponownego zapisywania danych, które zostały już klastrowane, ale uniemożliwia wykonywanie przyszłych OPTIMIZE
operacji przy użyciu kluczy 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;
Zgodność tabel z klastrowaniem płynnym
Tabele utworzone przy użyciu płynnego klastrowania w środowisku Databricks Runtime 14.1 lub nowszym używają domyślnie punktów kontrolnych w wersji 2. Tabele można odczytywać i zapisywać przy użyciu punktów kontrolnych w wersji 2 w środowisku Databricks Runtime 13.3 LTS lub nowszym.
Możesz wyłączyć punkty kontrolne w wersji 2 i protokoły tabeli na starszą dół, aby odczytywać tabele z klastrowaniem płynnym w środowisku Databricks Runtime 12.2 LTS i nowszym. Zobacz Usuwanie funkcji tabeli delty.
Ograniczenia
Istnieją następujące ograniczenia:
- W środowisku Databricks Runtime 15.1 lub nowszym klastrowanie na zapisie nie obsługuje zapytań źródłowych obejmujących filtry, sprzężenia ani agregacje.
- Obciążenia przesyłania strumieniowego ze strukturą nie obsługują klastrowania na zapisie.
- Nie można utworzyć tabeli z włączonym klastrowaniem liquid przy użyciu zapisu ze strukturą przesyłania strumieniowego. Za pomocą przesyłania strumieniowego ze strukturą można zapisywać dane w istniejącej tabeli z włączonym klastrowaniem liquid.