如何在 Redshift 中创建自定义聚合 UDF 函数?
Posted
技术标签:
【中文标题】如何在 Redshift 中创建自定义聚合 UDF 函数?【英文标题】:How to create customized aggregation UDF function in Redshift? 【发布时间】:2016-01-26 11:05:12 【问题描述】:是否可以在 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】:截至今天,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)
【讨论】:
那么有一个限制,time_series的长度永远不能超过listagg的最大允许长度以上是关于如何在 Redshift 中创建自定义聚合 UDF 函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TypedRowControllerType 在 Eureka 4.3 中创建自定义演示者行?
如何在 Firebase 中创建基于角色的访问控制或自定义声明
如何在 Visual Studio 2017 的 ASP.NET MVC 中创建自定义生成/脚手架模板(Razor)?