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 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ę:

  1. 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);
    
  2. 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.

DELETEpolecenia , MERGEi 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
  • CTASinstrukcje i RTAS
  • COPY INTO z formatu Parquet
  • spark.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.