我知道我可以定义User Defined Function以执行一些自定义计算。我也知道我可以使用开箱即用的'开箱即用的' aggregation functions在使用GROUP BY
子句时将值集合减少为单个值。
是否可以定义用于GROUP BY
子句的自定义用户定义聚合函数?
答案 0 :(得分:8)
事实证明这是可能的(只要我们寻求聚合的组在内存中具有合理的大小)和一点点“胶水” - 即ARRAY_AGG
函数
步骤如下:
ARRAY<T>
的输入参数创建UDF,其中T
是您要聚合的值的类型。ARRAY_AGG
函数和GROUP BY
子句生成T
数组并传入UDF。作为一个具体的例子:
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