Używanie płynnego klastrowania dla tabel delty

Ważne

Klaster liquid usługi Delta Lake jest dostępny w publicznej wersji zapoznawczej w środowisku Databricks Runtime 13.3 lub nowszym. Niektóre funkcje klastrowania liquid istnieją w środowisku Databricks Runtime 12.2 LTS lub nowszym. Zobacz Zgodność tabel z klastrowaniem płynnym.

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.

Ostrzeżenie

Środowisko Databricks Runtime 13.3 LTS i nowsze są wymagane do tworzenia, zapisu lub OPTIMIZE delty tabel z włączonym klastrowaniem płynnym.

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

Klaster płynny można włączyć w istniejącej tabeli lub podczas tworzenia tabeli. Klastrowanie nie jest zgodne z partycjonowaniem lub ZORDERwymaga, aby klient usługi Azure Databricks zarządzał wszystkimi operacjami układu i optymalizacji dla danych w tabeli. Po włączeniu uruchom OPTIMIZE zadania w zwykły sposób, aby przyrostowo utworzyć 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) USING DELTA 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.format("delta").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.format("delta").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?.

W środowisku Databricks Runtime 13.3 LTS i nowszym można włączyć klastrowanie liquid 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.

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
  • Wartość logiczna

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.

Większość operacji nie powoduje automatycznego klastrowania danych podczas zapisu. Operacje klastra w zapisie obejmują następujące elementy:

  • Operacje: INSERT INTO
  • Instrukcje CTAS
  • COPY INTO z formatu Parquet
  • spark.write.format("delta").mode("append")

Uwaga

Klastrowanie zapisu jest najlepszą aplikacją, która nie jest stosowana w następujących sytuacjach:

  • Jeśli operacja zapisu przekracza 512 GB danych.
  • Jeśli podzapytywanie SELECT zawiera przekształcenie, filtr lub sprzężenia.
  • Jeśli przewidywane kolumny nie są takie same jak tabela źródłowa.

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

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

Usługa Databricks zaleca używanie środowiska Databricks Runtime 13.3 LTS lub nowszego dla wszystkich obciążeń odczytujących lub zapisujących z tabel z włączonym 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:

  • Możesz określić tylko kolumny ze statystykami zebranymi dla kluczy klastrowania. Domyślnie pierwsze 32 kolumny w tabeli Delta mają zebrane statystyki.
  • Możesz określić do 4 kolumn jako kluczy klastrowania.
  • Obciążenia przesyłania strumieniowego ze strukturą nie obsługują klastrowania na zapisie.