I know I can define a User Defined Function in order to perform some custom calculation. I also know I can use the 'out-of-the-box' aggregation functions to reduce a collection of values to a single value when using a GROUP BY
clause.
Is it possible to define a custom user-defined, Aggregation Function to use with a GROUP BY
clause?
A user-defined function (UDF) lets you create a function by using a SQL expression or JavaScript code. A UDF accepts columns of input, performs actions on the input, and returns the result of those actions as a value. You can define a UDFs as either persistent or temporary.
The UDF has two formal parameters: row : an input row. emit : a hook used by BigQuery to collect output data. The emit function takes one parameter: a JavaScript object that represents a single row of output data.
ARRAY_AGG. Returns an ARRAY of expression values. To learn more about the optional arguments in this function and how to use them, see Aggregate function calls. To learn more about the OVER clause and how to use it, see Window function calls.
A user-defined function has three main components that are function declarations, function definition and function call. Further functions can be called by call by value or call by reference.
Turns out that this IS possible (as long as the groups we seek to aggregate are of a reasonable size in memory) with a little bit of 'glue' - namely the ARRAY_AGG
function
The steps are as follows:
ARRAY<T>
where T
is the type of value you want to aggregate.ARRAY_AGG
function in the query with the GROUP BY
clause to generate an array of T
and pass into your UDF.As a concrete example:
CREATE TEMP FUNCTION aggregate_fruits(fruits ARRAY<STRING>)
RETURNS STRING
LANGUAGE js AS """
return "my fruit bag contains these items: " + fruits.join(",");
""";
WITH fruits AS
(SELECT "apple" AS fruit
UNION ALL SELECT "pear" AS fruit
UNION ALL SELECT "banana" AS fruit)
SELECT aggregate_fruits(ARRAY_AGG(fruit))
FROM fruits
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With