Arbeiten mit Verknüpfungen in Azure Databricks
Databricks unterstützt die ANSI-Standardverknüpfungssyntax. In diesem Artikel werden Unterschiede zwischen Verknüpfungen mit Batch- und Datenstromverarbeitung beschrieben und einige Empfehlungen für die Optimierung der Verknüpfungsleistung bereitgestellt.
Hinweis
Databricks unterstützt auch die Standardsyntax für die Mengenoperatoren UNION
, INTERSECT
und EXCEPT
. Siehe Mengenoperatoren.
Unterschiede zwischen Streaming- und Batchverknüpfungen
Verknüpfungen in Azure Databricks sind entweder zustandsbehaftet oder zustandslos.
Alle Batchverknüpfungen sind zustandslose Verknüpfungen. Ergebnisse werden sofort verarbeitet und spiegeln Daten zum Zeitpunkt der Ausführung der Abfrage wider. Jedes Mal, wenn die Abfrage ausgeführt wird, werden neue Ergebnisse basierend auf den angegebenen Quelldaten berechnet. Siehe Batchverknüpfungen.
Verknüpfungen zwischen zwei Streamingdatenquellen sind zustandsbehaftet. In zustandsbehafteten Verknüpfungen verfolgt Azure Databricks Informationen zu den Datenquellen und den Ergebnissen und aktualisiert die Ergebnisse iterativ. Zustandsbehaftete Verknüpfungen können leistungsstarke Lösungen für die Online-Datenverarbeitung bereitstellen, können aber schwierig zu implementieren sein. Sie verfügen je nach Ausgabemodus, Triggerintervall und Grenzwerte über komplexe betriebstechnische Semantik. Siehe Stream-Stream-Verknüpfungen.
Stream-statische Verknüpfungen sind zustandslos, bieten aber eine gute Option zum Verknüpfen einer inkrementellen Datenquelle (z. B. einer Faktentabelle) mit einer statischen Datenquelle (z. B. einer sich langsam ändernden dimensionalen Tabelle). Anstatt alle Datensätze von beiden Seiten bei jeder Ausführung einer Abfrage zu verknüpfen, werden nur neu empfangene Datensätze aus der Streamingquelle mit der aktuellen Version der statischen Tabelle verknüpft. Siehe Stream-statische Verknüpfungen.
Batchverknüpfungen
Azure Databricks unterstützt standardmäßige SQL-Verknüpfungssyntax, einschließlich innerer, äußerer, Semi-, Anti- und Kreuzverknüpfungen. Siehe VERKNÜPFUNG.
Hinweis
Databricks empfiehlt die Verwendung einer materialisierten Ansicht, um die inkrementelle Berechnung der Ergebnisse einer inneren Verknüpfung zu optimieren. Weitere Informationen finden Sie unter Verwenden materialisierter Sichten in Databricks SQL.
Stream-Stream-Verknüpfungen
Das Verknüpfen zweier Streamingdatenquellen kann erhebliche Herausforderungen beim Verwalten von Zustandsinformationen und Auswerten von Berechnungs- und Ausgabeergebnissen mit sich bringen. Vor der Implementierung einer Stream-Stream-Verknüpfung empfiehlt Databricks, ein umfassendes Verständnis der operativen Semantik für zustandsbehaftetes Streaming zu entwickeln, einschließlich der Auswirkungen von Grenzwerten auf die Zustandsverwaltung. Weitere Informationen finden Sie in folgenden Artikeln:
- Was ist zustandsbehaftetes Streaming?
- Anwenden von Wasserzeichen zum Steuern von Datenverarbeitungsschwellenwerten
- Stream-Stream-Joins
Databricks empfiehlt die Angabe von Grenzwerten für beide Seiten aller Stream-Stream-Verknüpfungen. Folgende Untertypen werden unterstützt:
- Innere Verknüpfungen
- Linke äußere Joins
- Rechte äußere Joins
- Vollständige äußere Joins
- Linke Semiverknüpfungen
Weitere Informationen finden Sie in der Apache Spark Structured Streaming-Dokumentation zu Stream-Steam-Verknüpfungen.
Streamstatik-Verknüpfungen
Hinweis
Das beschriebene Verhalten für Stream-statische Verknüpfungen geht davon aus, dass die statischen Daten mithilfe von Delta Lake gespeichert werden.
Bei einer Stream-statisch-Verknüpfung wird die neueste gültige Version einer Delta-Tabelle (die statischen Daten) mithilfe einer zustandslosen Verknüpfung mit einem Datenstrom verknüpft.
Wenn Azure Databricks einen Mikrobatch von Daten in einer Stream-statisch-Verknüpfung verarbeitet, wird die neueste gültige Version von Daten aus der statischen Delta-Tabelle mit den Datensätzen verknüpft, die im aktuellen Mikrobatch enthalten sind. Da die Verknüpfung zustandslos ist, müssen Sie keine Wasserzeichen konfigurieren und können die Ergebnisse mit geringer Latenz verarbeiten. Die Daten in der statischen Delta-Tabelle, die in der Verknüpfung verwendet werden, sollten nur selten geändert werden.
Dieses Muster wird im folgenden Beispiel veranschaulicht:
streamingDF = spark.readStream.table("orders")
staticDF = spark.read.table("customers")
query = (streamingDF
.join(staticDF, streamingDF.customer_id==staticDF.id, "inner")
.writeStream
.option("checkpointLocation", checkpoint_path)
.table("orders_with_customer_info")
)
Optimieren der Leistung beim Verknüpfen
Compute mit aktiviertem Photon wählt immer den besten Verknüpfungstyp aus. Weitere Informationen finden Sie unter Was ist Photon?.
Die Verwendung einer aktuellen Databricks Runtime-Version mit aktiviertem Photon bietet in der Regel eine gute Verknüpfungsleistung, aber Sie sollten auch die folgenden Empfehlungen berücksichtigen:
- Kreuzverknüpfungen sind sehr teuer. Entfernen Sie Kreuzverknüpfungen aus Workloads und Abfragen, die eine niedrige Latenz oder häufige Neukompilierung erfordern.
- Die Reihenfolge der Verknüpfungen ist wichtig. Wenn Sie mehrere Verknüpfungen ausführen, verknüpfen Sie ihre kleinsten Tabellen immer zuerst, und verknüpfen Sie das Ergebnis dann mit größeren Tabellen.
- Der Optimierer kann bei Abfragen mit vielen Verknüpfungen und Aggregationen Schwierigkeiten haben. Das Speichern von Zwischenergebnissen kann die Abfrageplanung und das Berechnen von Ergebnissen beschleunigen.
- Halten Sie Statistiken auf dem neusten Stand, um die Leistung zu verbessern. Führen Sie die Abfrage
ANALYZE TABLE table_name COMPUTE STATISTICS
aus, um Statistiken im Abfrageplaner zu aktualisieren.
Hinweis
In Databricks Runtime 14.3 LTS und höher können Sie die Spalten ändern, zu denen Delta Lake Statistiken sammelt, überspringen und dann vorhandene Statistiken im Delta-Protokoll neu kompensieren. Weitere Informationen finden Sie unter Angeben von Delta-Statistikspalten.
Verknüpfungshinweise in Azure Databricks
Apache Spark unterstützt das Angeben von Verknüpfungshinweisen für Bereichsverknüpfungen und Neigungsverknüpfungen. Hinweise für Neigungsverknüpfungen sind nicht erforderlich, da Azure Databricks diese Verknüpfungen automatisch optimiert. Siehe Hinweise.
Hinweise für Bereichsverknüpfungen können nützlich sein, wenn die Verknüpfungsleistung schlecht ist und Sie ungleiche Verknüpfungen vornehmen. Beispiele hierfür sind das Verknüpfen von Zeitstempelbereichen oder ein Bereich von Clustering-IDs. Weitere Informationen finden Sie unter Range join optimization.