Partycjonowanie tabel Delta

Partycjonowanie w stylu Hive dzieli tabelę Delta na fizyczne podkatalogi na podstawie wartości jednej lub większej liczby kolumn partycji. Każda unikatowa kombinacja wartości kolumn partycji tworzy oddzielny katalog. Ten układ umożliwia oczyszczanie partycji: aparat pomija całe katalogi, gdy zapytanie filtruje kolumnę partycji.

Wskazówka

W przypadku większości obciążeń, począwszy od wersji Fabric Runtime 2.0, klastrowanie płynne jest zalecaną strategią organizacji danych pod kątem wydajności odczytu. Głównym powodem używania partycjonowania jest włączenie współbieżnych operacji zapisu, które nie powodują konfliktu.

Aby uzyskać pełne wskazówki dotyczące klastrowania liquid, zobacz Klastrowanie liquid.

Kiedy należy używać partycjonowania

Podstawowy przypadek użycia partycjonowania w usłudze Delta Lake polega na włączeniu współbieżnych operacji zapisu, które nie powodują konfliktu. Usługa Delta Lake używa optymistycznej kontrolki współbieżności, a dwie operacje, które dotykają tych samych plików, mogą powodować konflikt. Partycjonowanie umożliwia wykonywanie współbieżnych operacji na zestawach rozłącznych plików przez działanie na oddzielnych partycjach.

Stosuj partycjonowanie, gdy:

  • Masz współbieżne procesy zapisu, które muszą aktualizować, usuwać lub scalać dane w tej samej tabeli bez powodowania konfliktów — na przykład wiele potoków przetwarzających jednocześnie różne jednostki biznesowe lub regiony.
  • Kolumna partycji ma niską lub umiarkowaną kardynalność (dziesiątki do setek odrębnych wartości, a nie tysięcy). Uwaga: większe tabele mogą pomieścić więcej partycji. Docelowy co najmniej 1 GB danych w każdej partycji.
  • Wartości partycji są dopasowane do Twoich wzorców zapisu — każdy zapisujący proces naturalnie kieruje zapis do określonej partycji.

Important

Jeśli chodzi wyłącznie o pomijanie plików i wydajność odczytu, liquid clustering jest skuteczniejsze niż partycjonowanie. Liquid Clustering eliminuje ryzyko problemów wynikających z małych plików w przypadku kolumn partycjonowania o wysokiej kardynalności i umożliwia zmianę strategii klastrowania na różnych etapach cyklu życia tabeli. Wybierz partycjonowanie przede wszystkim wtedy, gdy musisz odizolować współbieżne moduły zapisywania.

Tworzenie tabeli partycjonowanej

CREATE TABLE sales.orders (
    order_id BIGINT,
    order_date DATE,
    region STRING,
    amount DECIMAL(10,2)
)
USING DELTA
PARTITIONED BY (region)

Partycjonowanie i współbieżne zapisy

Partycjonowanie jest podstawowym mechanizmem w Delta Lake, pozwalającym uniknąć konfliktów między współbieżnymi operacjami zapisu. Gdy tabela jest podzielona na partycje, operacje przeznaczone dla różnych partycji działają na rozłącznych zestawach plików i nie powodują konfliktu ze sobą.

Na przykład dwie współbieżne operacje MERGE INTO na tabeli podzielonej na partycje według region nie kolidują ze sobą, o ile każda z nich jest skierowana do innego regionu — pod warunkiem, że kolumna partycjonowania jest jawnie uwzględniona w warunku scalania:

-- Pipeline A: processes North America only
MERGE INTO sales.orders AS target
USING staged_orders AS source
ON target.order_id = source.order_id
    AND target.region = 'NA'
    AND source.region = 'NA'
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *

Bez partycjonowania — lub bez uwzględnienia kolumny partycjonowania w warunku operacji — te same operacje mogą wchodzić ze sobą w konflikt, nawet jeśli logicznie modyfikują różne wiersze. Kolumna partycji musi być wyświetlana w samym warunku scalania, a nie tylko w danych źródłowych. Bez niego usługa Delta Lake nie może określić w czasie weryfikacji, że dwie operacje dotknąły rozłącznych zestawów plików.

Pełny przewodnik po typach konfliktów i strategiach rozwiązywania problemów można znaleźć w temacie Kontrola współbieżności.

Typowe pułapki

  • Kolumny partycji o wysokiej kardynalności (na przykład user_id z milionami wartości) tworzą tysiące małych katalogów i plików, co obniża wydajność zapisu i odczytu.
    • Kolumny dat należy wybrać ostrożnie. W przypadku wielu tabel partycjonowanie według kolumny dat powoduje zbyt wiele małych partycji. Docelowy co najmniej 1 GB danych w każdej partycji.
  • Nie można zmienić kolumn partycji po utworzeniu tabeli bez ponownego zapisywania całej tabeli.
  • Mały problem z plikiem występuje często w przypadku przesyłania strumieniowego lub częste dołączania do wielu partycji, ponieważ każdy zapis tworzy co najmniej jeden plik na partycję.
  • Partycjonowanie i klastrowanie płynne są niezgodne w tej samej tabeli. Musisz wybrać jedną strategię.

Porównanie partycjonowania i klastrowania cieczy

Aspekt Partycjonowanie w stylu Hive Klastrowanie cieczy
Najlepsze dla Izolacja współbieżnych zapisów Ogólnego przeznaczenia pomijanie plików i optymalizacja odczytu
Ziarnistość Jeden katalog na unikatową wartość (lub kombinację) Zakresy wartości na poziomie pliku, brak katalogów
Wysoka kardynalność Tworzy tysiące małych plików/katalogów Działa w sposób naturalny; grupuje dane w pliki o odpowiednim rozmiarze
Zmiany kolumn Wymaga ponownego zapisywania pełnej tabeli ALTER TABLE CLUSTER BY dotyczy następnego OPTIMIZE
Ścieżka zapisu Kolumna partycji musi być znana w czasie zapisu Dowolna kolumna może być klastrowana po fakcie
Współbieżne zapisy Rozłączne partycje zapobiegają konfliktom Tylko dopisywanie bez konfliktów; aktualizacje/usuwanie/scalanie mogą powodować konflikty w tabelach niepartycjonowanych
Problem z małym plikiem Typowe przy przesyłaniu strumieniowym lub częstym wstawianiu Zarządzane przez OPTIMIZE kompaktowanie