Partitionierung für Delta-Tabellen

Bei der Partitionierung im Hive-Stil wird eine Delta-Tabelle anhand der Werte einer oder mehrerer Partitionsspalten in physische Unterverzeichnisse aufgeteilt. Jede eindeutige Kombination aus Partitionsspaltenwerten erstellt ein separates Verzeichnis. Dieses Layout ermöglicht Partition Pruning: die Engine überspringt ganze Verzeichnisse, wenn eine Abfrage die Partitionsspalte als Filter verwendet.

Tipp

Für die meisten Workloads ist ab Fabric Runtime 2.0 liquid Clustering die empfohlene Strategie für das Datenlayout, um die Leseleistung zu verbessern. Der Hauptgrund für die Verwendung der Partitionierung besteht darin , gleichzeitige Schreibvorgänge zu aktivieren, die keinen Konflikt verursachen.

Vollständige Flüssigkeitsclustering-Anleitungen finden Sie unter Liquid Clustering.

Wann die Partitionierung verwendet werden soll

Der primäre Anwendungsfall für die Partitionierung in Delta Lake ermöglicht gleichzeitige Schreibvorgänge, die keinen Konflikt verursachen. Delta Lake verwendet optimistische Parallelitätssteuerung, und zwei Vorgänge, die dieselben Dateien berühren, können in Konflikt geraten. Die Partitionierung ermöglicht es gleichzeitigen Vorgängen, sich auf nicht zusammenhängende Dateien zu konzentrieren, indem sie auf separate Partitionen arbeiten.

Partitionierung verwenden, wenn:

  • Sie verfügen über gleichzeitige Autoren , die eine Aktualisierung, Löschung oder Zusammenführung in derselben Tabelle ohne Konflikte ausführen müssen, z. B. mehrere Pipelines, die unterschiedliche Geschäftseinheiten oder Regionen gleichzeitig verarbeiten.
  • Ihre Partitionsspalte weist geringe bis moderate Kardinalität auf (zehn bis hunderte von unterschiedlichen Werten, nicht Tausende). Hinweis: Größere Tabellen können mehr Partitionen aufnehmen. Legen Sie mindestens 1 GB Daten in jeder Partition fest.
  • Partitionswerte richten sich an Ihren Schreibmustern – jeder Writer zielt natürlich auf eine bestimmte Partition ab.

Important

Allein für das Überspringen und Lesen von Dateien ist das Flüssigclustering effektiver als Partitionierung. Liquid Clustering beseitigt das Risiko von Problemen mit zu vielen kleinen Dateien durch Partitionsspalten mit hoher Kardinalität und ermöglicht es, die Clustering-Strategie im Verlauf des Lebenszyklus der Tabelle zu ändern. Wählen Sie die Partitionierung in erster Linie aus, wenn Sie gleichzeitige Autoren isolieren müssen.

Erstellen einer partitionierten Tabelle

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

Partitionierung und gleichzeitige Schreibvorgänge

Partitionierung ist der primäre Mechanismus in Delta Lake, um Konflikte zwischen gleichzeitigen Schreibvorgängen zu vermeiden. Wenn eine Tabelle partitioniert wird, werden Vorgänge, die auf unterschiedliche Partitionen abzielen, auf nicht zusammenhängende Dateien angewendet und stehen nicht miteinander in Konflikt.

Beispielsweise geraten zwei gleichzeitige MERGE INTO-Vorgänge auf einer nach region partitionierten Tabelle nicht in Konflikt, solange jeder Vorgang auf eine andere Region abzielt – vorausgesetzt, die Partitionsspalte wird in die Merge-Bedingung explizit einbezogen:

-- 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 *

Ohne Partitionierung – oder ohne Einschließen der Partitionsspalte in die Vorgangsbedingung – können dieselben Vorgänge auch dann in Konflikt geraten, wenn sie logisch unterschiedliche Zeilen ändern. Die Partitionsspalte muss in der Zusammenführungsbedingung selbst und nicht nur in den Quelldaten angezeigt werden. Ohne dies kann Delta Lake zur Überprüfungszeit nicht ermitteln, dass die beiden Vorgänge nicht zusammenhängende Dateisätze berührt haben.

Eine vollständige Anleitung zu Konflikttypen und Lösungsstrategien finden Sie unter Concurrency Control.

Häufige Fallstricke

  • Partitionsspalten mit hoher Kardinalität (zuser_id. B. mit Millionen von Werten) erstellen Tausende von winzigen Verzeichnissen und Dateien, die sowohl die Schreib- als auch die Leseleistung beeinträchtigen.
    • Datumsspalten sollten mit Vorsicht ausgewählt werden. Bei vielen Tabellen führt die Partitionierung nach einer Datumsspalte zu vielen kleinen Partitionen. Legen Sie mindestens 1 GB Daten in jeder Partition fest.
  • Partitionsspalten können nach der Tabellenerstellung nicht geändert werden, ohne die gesamte Tabelle neu zu schreiben.
  • Kleines Dateiproblem ist bei Streaming oder häufigen Anfügevorgängen in vielen Partitionen üblich, da jeder Schreibvorgang mindestens eine Datei pro Partition erstellt.
  • Partitionierung und Flüssigclustering sind in derselben Tabelle nicht kompatibel. Sie müssen eine Strategie auswählen.

Vergleichen von Partitionierung und Flüssigclustering

Aspect Hive-Partitionierung Flüssigkeitsclusterbildung
Am besten geeignet für Gleichzeitige Writer-Isolation Allgemeines Überspringen von Dateien und Leseoptimierung
Granularität Ein Verzeichnis pro unterschiedlichen Wert (oder Kombination) Wertebereiche auf Dateiebene, keine Verzeichnisse
Hohe Kardinalität Erstellt Tausende kleiner Dateien/Verzeichnisse Verarbeitet Daten ganz natürlich; unterteilt Daten in Dateien passender Größe
Spaltenänderungen Erfordert eine vollständige Neuschreibung der Tabelle ALTER TABLE CLUSTER BY gilt für nächstes OPTIMIZE
Schreibpfad Partitionsspalte muss zur Schreibzeit bekannt sein Jede Spalte kann nachträglich geclustert werden.
Gleichzeitige Schreibvorgänge Nicht zusammenhängende Partitionen vermeiden Konflikte Nur Anhängen ohne Konflikte; Aktualisierungen, Löschungen und Zusammenführungen können bei nicht partitionierten Tabellen zu Konflikten führen
Problem mit kleiner Datei Üblich bei Streaming oder häufigen Einfügungen Verwaltet durch OPTIMIZE Komprimierung