如何在 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 函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 Redshift 中创建 python UDF 时出错

如何使用 TypedRowControllerType 在 Eureka 4.3 中创建自定义演示者行?

如何在 Firebase 中创建基于角色的访问控制或自定义声明

如何在 Visual Studio 2017 的 ASP.NET MVC 中创建自定义生成/脚手架模板(Razor)?

有没有办法在聚合调用中不使用 ORDER BY 对 postgresql 自定义聚合中的行进行预排序?

如何在 Redshift(亚马逊)中更新 UDF?