Low Shuffle Merge-Optimierung für Delta-Tabellen

Über den Delta Lake-Befehl MERGE können Sie eine Delta-Tabelle mit erweiterten Bedingungen aktualisieren. Hierbei können Sie Daten aus einer Quelltabelle, einer Ansicht oder einem Datenframe mit einem MERGE-Befehl aktualisieren. Der aktuelle Algorithmus ist jedoch nicht vollständig für die Verarbeitung unveränderter Zeilen optimiert. Bei der Low Shuffle Merge-Optimierung werden unveränderte Zeilen von einem kostspieligen Shufflevorgang ausgenommen, der zum Aktualisieren übereinstimmender Zeilen erforderlich ist.

Warum wird Low Shuffle Merge benötigt?

Derzeit erfolgt ein MERGE-Vorgang über zwei Join-Ausführungen. Der erste Join verwendet die gesamte Zieltabelle und die Quelldaten, um eine Liste der geänderten Dateien der Zieltabelle einschließlich aller übereinstimmenden Zeilen zu ermitteln. Anschließend erfolgt der zweite Join, bei dem nur die geänderten Dateien und Quelldaten gelesen werden, um die eigentliche Tabellenaktualisierung durchzuführen. Auch wenn der erste Join dazu dient, die Datenmenge für den zweiten Join zu reduzieren, kann die Anzahl der unveränderten Zeilen in geänderten Dateien dennoch sehr hoch sein. Die erste Join-Abfrage ist schlanker, da sie nur die Spalten liest, die der vorgegebenen Abgleichsbedingung entsprechen. Beim zweiten Join zur Aktualisierung der Tabelle müssen alle Spalten geladen werden, was einen kostspieligen Shuffleprozess nach sich zieht.

Bei der Low Shuffle Merge-Optimierung behält Delta das Ergebnis des Zeilenabgleichs aus dem ersten Join vorübergehend bei und verwendet es für den zweiten Join. Basierend auf dem Ergebnis werden unveränderte Zeilen vom kostspieligen Shuffleprozess ausgeschlossen. Es erfolgen dann zwei getrennte Schreibaufträge für übereinstimmende Zeilen und unveränderte Zeilen, was zu einer doppelten Anzahl von Ausgabedateien im Vergleich zum vorherigen Verhalten führen kann. Der erwartete Leistungsgewinn überwiegt jedoch das mögliche Problem kleiner Dateien.

Verfügbarkeit

Hinweis

  • Low Shuffle Merge steht als Previewfunktion zur Verfügung.

Es ist in Synapse-Pools für die Apache Spark-Versionen 3.2 und 3.3 verfügbar.

Version Verfügbarkeit Standard
Delta 0.6 / Spark 2.4 Nein -
Delta 1.2 / Spark 3.2 Yes false
Delta 2.2 / Spark 3.3 Yes true

Vorteile von Low Shuffle Merge

  • Unveränderte Zeilen in geänderten Dateien werden separat behandelt und durchlaufen nicht den eigentlichen MERGE-Vorgang. Auf diese Weise können Sie die MERGE-Ausführungszeit insgesamt verkürzen und Computeressourcen einsparen. Der Gewinn ist höher, wenn viele Zeilen kopiert und nur wenige Zeilen aktualisiert werden.
  • Die Zeilenreihenfolge bleibt für unveränderte Zeilen erhalten. Daher können Ausgabedateien mit unveränderten Zeilen immer noch effizient für das Überspringen von Daten sein, wenn die Datei sortiert ist oder eine Z-Reihenfolge aufweist.
  • Selbst im schlimmsten Fall, wenn die MERGE-Bedingung auf alle Zeilen in den geänderten Dateien zutrifft, wäre der Mehraufwand nur gering.

Aktivieren und Deaktivieren von Low Shuffle Merge

Sobald die Konfiguration für den Pool oder die Sitzung festgelegt ist, verwenden alle Spark-Schreibmuster die Funktionalität.

Aktivieren Sie die Verwendung der Low Shuffle Merge-Optimierung mit der folgenden Konfiguration:

  1. Scala und PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "true")
  1. Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = true

Verwenden Sie den folgenden Befehl, um den aktuellen Konfigurationswert zu überprüfen:

  1. Scala und PySpark
spark.conf.get("spark.microsoft.delta.merge.lowShuffle.enabled")
  1. Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled`

Um das Feature zu deaktivieren, ändern Sie die folgende Konfiguration wie unten gezeigt:

  1. Scala und PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "false")
  1. Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = false