Veröffentlicht: 19. September 2023
von Xinyi Yu, Wenchen Fan und Gengliang Wang
Wir freuen uns, die Unterstützung für eine neue SQL-Funktion in Apache Spark und Databricks vorzustellen: Lateral Column Alias (LCA). Diese Funktion vereinfacht komplexe SQL-Abfragen, indem sie es Benutzern ermöglicht, einen Ausdruck, der früher in derselben SELECT-Liste angegeben wurde, wiederzuverwenden. Dadurch entfällt in vielen Fällen die Notwendigkeit, verschachtelte Unterabfragen und Common Table Expressions (CTEs) zu verwenden. Dieser Blogbeitrag erörtert die Anwendungsfälle der Funktion und die Vorteile, die sie für Spark- und Databricks-Benutzer bringt.
Lateral Column Alias (LCA) bietet Benutzern die Möglichkeit, einen Ausdruck, der früher in derselben SELECT-Liste angegeben wurde, wiederzuverwenden.
Diese Funktion kann anhand des unten angegebenen Beispiels besser verstanden werden. Hier ist eine einfache Abfrage:
In Abwesenheit der LCA-Unterstützung erhalten Benutzer bei dieser Abfrage einen Fehler, dass das spätere a in der SELECT-Liste nicht aufgelöst werden kann:
[UNRESOLVED_COLUMN.WITHOUT_SUGGESTION] Eine Spalte oder ein Funktionsparameter mit dem Namen `a` kann nicht aufgelöst werden. ; Zeile 1 Pos 15;
Glücklicherweise identifiziert das zweite a in der Abfrage dank der LCA-Funktion nun erfolgreich den zuvor definierten Alias in derselben SELECT-Liste: 1 AS a. Benutzer erhalten keinen Fehler mehr, sondern die folgenden Ergebnisse:
Während die vorherigen Beispiele das Grundkonzept von LCA veranschaulichen, liegt die wahre Stärke dieser Funktion in ihrer Fähigkeit, komplexe Unterabfragen und CTEs zu eliminieren.
Vor der Einführung von LCA mussten Benutzer mit mehreren Unterabfragen und CTEs umgehen, wenn sie auf ein Attribut verweisen wollten, das durch einen früheren Alias definiert wurde. Dies erhöhte die Komplexität und Ausführlichkeit von SQL-Abfragen, wodurch sie schwer zu lesen, zu schreiben und zu warten waren. Im Gegensatz dazu vereinfacht die LCA-Unterstützung diese Abfragen grundlegend und macht sie benutzerfreundlicher und überschaubarer.
Nehmen wir ein Beispiel. Angenommen, es gibt eine products-Tabelle, die Produktinformationen wie Name, Kategorie, Preis und Kundenbewertung speichert. Unser Ziel ist es, einen angepassten Preis auf der Grundlage mehrerer Einflussfaktoren zu berechnen. Das Szenario wird klar verdeutlichen, wie LCA eine komplizierte Abfrage in eine deutlich vereinfachte Version verwandeln kann.
Hier ist die Tabellenstruktur:
Wir möchten den angepassten Preis für jedes Produkt auf der Grundlage des größeren Wertes zweier Faktoren berechnen: des prozentualen Preisaufschlags basierend auf der Bewertung des Produkts durch die Benutzer und basierend auf dem Rang des Produkts innerhalb seiner Kategorie. Ohne LCA-Unterstützung sieht die Abfrage wie folgt aus:
Die Logik enthält viele Verkettungsoperationen, bei denen eine spätere Berechnung von zuvor berechneten Ergebnissen abhängt. Daher sind mehrere CTEs erforderlich, um jede Zwischenberechnung so zu speichern, dass sie in den nachfolgenden Phasen der Abfrage später referenziert werden kann.
Mit LCA ist es jedoch möglich, die Abfrage stattdessen als eine einzige SELECT-Anweisung auszudrücken:
LCAs können auch verkettet werden! Das bedeutet, dass der aktuelle Alias-Ausdruck, auf den von nachfolgenden Ausdrücken verwiesen werden kann, einen zuvor definierten lateralen Alias referenzieren kann. Zum Beispiel hängt die Definition von final_increase_percentage von zwei lateralen Spalten-Aliassen ab: increase_percentage_based_on_rating und increase_percentage_based_on_rank. Die folgende Berechnung von adjusted_price verweist dann auf final_increase_percentage. Diese Verkettungsfähigkeit von LCA ermöglicht es Benutzern, eine Reihe von abhängigen Berechnungen zu erstellen, bei denen die Ergebnisse einer Berechnung als Eingaben für die nächste verwendet werden.
Wie wir im obigen Beispiel sehen können, vereinfacht LCA die Abfrage weitgehend, eliminiert wiederholte Berechnungen oder die Notwendigkeit mehrerer CTEs, wodurch sie leichter zu verstehen, zu warten und zu debuggen ist. Sie verbessert auch die Lesbarkeit, da die Berechnungsdefinition und die Verwendung in der Abfrage nahe beieinander liegen.
Fast jeder Ausdruck kann innerhalb eines lateralen Spalten-Alias platziert werden. Die Beispiele im letzten Abschnitt zeigen, dass komplexe CASE-WHEN-Ausdrücke sowie GREATEST-Funktionsausdrücke oder sogar Fensterfunktionen innerhalb eines lateralen Spalten-Alias für die weitere Verwendung in nachfolgenden Ausdrücken enthalten sein können.
Auf die gleiche Weise können wir auch Aggregationsausdrücke auf diese Weise verschachteln. Hier ist ein Beispiel für dieselbe products-Tabelle:
LCA funktioniert auch gut mit komplexen Datentypen wie Struct, Array und Map. Zum Beispiel:
LCA garantiert, dass nicht-deterministische Ausdrücke nur einmal ausgewertet werden, was die „einmalige Ausführung“-Semantik widerspiegelt, die CTEs bieten. Dies gewährleistet konsistente Ergebnisse bei der Verwendung von nicht-deterministischen Ausdrücken in der Abfrage.
Betrachten Sie zum Beispiel ein Szenario, in dem es für jedes Produkt in der obigen products-Tabelle einen member_price gibt. Wir möchten auf jeden Produkt einen zufälligen Rabattprozentsatz zwischen 0 % und 5 % anwenden und dann den rabattierten Preis sowohl für den price als auch für den member_price berechnen. Diese Übung sollte sicherstellen, dass der angewendete Rabattprozentsatz für beide Preise gleich bleibt.
Mit LCA können wir schreiben:
In diesem Beispiel berechnet Databricks den discounted_rate einmal, und dieser Wert bleibt bei allen nachfolgenden Verweisen gleich, einschließlich der Berechnung von adjusted_price und adjusted_member_price.
Wenn wir hingegen einfach nicht-deterministische Ausdrücke kopieren, trifft dieses Verhalten nicht zu, da jeder Ausdruck separat ausgewertet würde, was zu inkonsistenten Rabattraten für die beiden Preise führt:
Zusammenfassend lässt sich sagen, dass Lateral Column Alias (LCA) eine leistungsstarke Funktion ist, die SQL-Abfragen erheblich vereinfacht, indem sie es Benutzern ermöglicht, einen benannten Alias über einen Ausdrucksbaum zu definieren und diesen Alias dann später innerhalb derselben SELECT-Klausel zu referenzieren.
LCA ist vollständig verfügbar und standardmäßig aktiviert in Databricks Runtime 12.2 LTS und neuer, in Databricks SQL 2023.20 und neuer sowie Apache Spark 3.4.
(Dieser Blogbeitrag wurde mit KI-gestützten Tools übersetzt.) Originalbeitrag
