如何在Redshift中创建自定义聚合UDF函数?

4

在Redshift中是否可以创建自定义聚合UDF函数?如果可以,我在哪里可以找到相关的教程或文档?

我的数据如下:

A     B     time_series

a1    b1    "[1,2,3]"
a1    b2    "[2,3,4]"
a2    b1    "[2,2,2]"

我希望能够按照 A 或 B 进行分组,并得到平均时间序列。

例如,按照 A 进行分组:

a1   "[1.5, 2.5, 3.5]"
a2   "[2,2,2]"
1个回答

1
截至今天,UDF只能应用于单行数据。因此,要实现您想要的功能,您需要将值预先合并到单行中,然后应用UDF进行计算。
例如:
创建UDF:
CREATE FUNCTION f_mean(time_series VARCHAR)
RETURNS varchar
IMMUTABLE AS $$
import json
data = [json.loads(x.replace('"', '')) for x in time_series.split('""')]
return json.dumps([sum(e)/float(len(e)) for e in zip(*data)])
$$ LANGUAGE plpythonu;

使用 LISTAGG 函数将值合并为单行,然后应用 UDF。
mydb=> select A, f_mean(listagg(time_series)) within group (order by A) from my_table group by A;
 a  |     f_mean      
----+-----------------
 a2 | [2.0, 2.0, 2.0]
 a1 | [1.5, 2.5, 3.5]
(2 rows)

2
它有一个限制,即time_series的长度永远不能超过listagg允许的最大长度。 - Hello lad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接