- Kategorien:
Aggregatfunktionen (Allgemein)
ACCUMULATE¶
Gibt einen benutzerdefinierten Aggregatwert zurück, der von vier benutzerdefinierten SQL Lambda-Funktionen berechnet wird: initialisieren, akkumulieren, kombinieren und beenden. ACCUMULATE folgt dem MapReduce-Aggregationsmodell und ist in GROUP BY, HAVING und Unterabfragen auf die gleiche Weise wie systemeigene Aggregate integriert.
ACCUMULATE ist besonders nützlich für das Prototyping und einmalige Aggregationen, die von keinem integrierten Aggregat abgedeckt werden. Für leistungsempfindliche Workloads sollten Sie nach Möglichkeit integrierte Aggregate bevorzugen oder überlegen, ob eine Kombination von integrierten Aggregaten und Joins das gleiche Ergebnis erzielen kann. ACCUMULATE mit den Statustypen OBJECT, ARRAY oder VARIANT verursacht zusätzlichen Leistungsaufwand.
Syntax¶
Argumente¶
input_exprAusdruck wird einmal pro Nicht-NULL-Eingabezeile ausgewertet. Der resultierende Wert wird jedem Lambda als Eingabewert übergeben.
initialize_lambdaLambda mit Signatur
(value) -> <state_expr>. Wird einmal pro Nicht-NULL-Eingabezeile aufgerufen, um den anfänglichen Teilstatus aus dem Wert dieser Zeile zu erzeugen.accumulate_lambdaLambda mit Signatur
(state, value) -> <state_expr>. Ordnet einen neuen Eingabewert in einen vorhandenen Teilstatus ein und gibt den aktualisierten Status zurück.combine_lambdaLambda mit Signatur
(state1, state2) -> <state_expr>. Führt zwei Teilstatus zusammen, die von parallelen Workern erstellt wurden. Muss assoziativ sein.terminate_lambdaLambda mit Signatur
(state) -> <output_expr>. Konvertiert den endgültigen zusammengeführten Status in den Ergebniswert, der an die Abfrage zurückgegeben wird.
Lambda-Argumentnamen sind beliebig. Typanmerkungen sind optional; siehe`Typ-Inferenz`_ für Details.
Rückgabewerte¶
Gibt den von terminate_lambda erzeugten Wert zurück. Der Datentyp stimmt mit dem Rückgabetyp von terminate_lambda überein. Gibt NULL zurück, wenn alle Eingabezeilen NULL sind oder das Eingabeset leer ist.
Nutzungshinweise¶
NULL-Eingabezeilen werden stillschweigend im Einklang mit dem Standard-SQL-Aggregatverhalten übersprungen, bevor ein Lambda aufgerufen wird. Wenn alle Eingabezeilen NULL sind oder das Eingabeset leer ist, ist das Ergebnis NULL.
ACCUMULATE hat keine persistente Form. Es gibt keine CREATE AGGREGATE FUNCTION oder eine äquivalente DDL. Um eine Aggregation wiederzuverwenden, schließen Sie sie in eine Ansicht, CTE oder gespeicherte Prozedur ein.
Lambdas können nur auf ihre deklarierten Parameter verweisen. Referenzen auf Spalten aus der äußeren Abfrage sind nicht erlaubt. Um einen Wert für die äußere Abfrage einzufügen, projizieren Sie ihn in den Eingabeausdruck oder berechnen ihn vorab in einem CTE.
Das folgende Beispiel verursacht einen Kompilierungsfehler, weil
column2kein Lambda-Parameter ist:Die folgenden Funktionsklassen sind in Lambdas nicht erlaubt:
Funktionsklasse
Beispiele
Aggregatfunktionen
SUM, AVG, COUNT
Fensterfunktionen
ROW_NUMBER() OVER (…)
Nicht deterministische Funktionen
RANDOM(), UUID_STRING()
Typableitung¶
Lambda-Argumenttypen sind optional. Wenn sie weggelassen werden, werden die Typen aus dem Eingabeausdruck abgeleitet und über die Lambda-Kette weitergegeben.
Explizite Typen werden nicht über Lambdas hinweg erzwungen. Wenn Sie einen Typ in einem beliebigen Lambda-Argument mit Anmerkungen versehen, ist diese Anmerkung verbindlich für den Zustandstyp an dieser Position. Wenn Anmerkungen über die vier Lambdas hinweg inkonsistent sind und nicht abgeglichen werden können (z. B.
initializegibt ARRAY zurück, aberaccumulatedeklariert den Status alsINT), schlägt die Kompilierung fehl.Sie können alle Typanmerkungen weglassen oder nur einige Argumente kommentieren. Der Compiler leitet ab und erweitert Typen automatisch. Das Mischen von kommentierten und nicht kommentierten Argumenten ist zulässig, solange die expliziten Anmerkungen konsistent sind.
Der Zustandstyp (der Typ, der zwischen Initialisieren, Akkumulieren und Kombinieren übergeben wird) und der Ausgabetyp (der Rückgabetyp bei Beendigung) werden unabhängig voneinander verfolgt und können sich unterscheiden.
Der Eingabeausdruck wird implizit in den Typ umgewandelt, der von dem initialisierten Lambda
value-Argument erwartet wird. Beispiel: Wenn die Eingabespalte INT lautet undvalueals STRING deklariert ist, wird die Umwandlung automatisch angewendet.
Beispiele¶
Berechnen Sie die Summe einer Spalte und simulieren Sie das entsprechende Verhalten der vorhandenen SUM(c1)-Aggregatfunktion:
Berechnen Sie das Produkt aller Werte in einer Gruppe.
Berechnen Sie den Mittelwert mit einem ARRAY, um die laufende Summe zu verfolgen und zu zählen:
Berechnen Sie den Mittelwert mit einem strukturierten OBJECT als Zustand:
Suchen Sie die kürzeste Zeichenfolge in einer Spalte:
Verwenden Sie ACCUMULATE mit GROUP BY:
Rufen Sie eine UDF innerhalb eines Lambda auf: