Presto 和 AWS Athena 中的乘法聚合运算符

Multiplication Aggregate Operator in Presto and AWS Athena

我最近一直在使用 AWS Athena,我需要乘以特定列的值(所有这些都是正数)。看到 SUM(column1) 是 Presto 中一个随时可用的聚合函数(这是 Athena 查询引擎构建的基础),我希望我能找到类似的东西而不是返回一个产品。

不幸的是,正如 this 问题中所述,甚至 SQL 也没有这样的东西。这意味着……惊喜,Presto 也没有!那么,知道没有内置的解决方案,我们如何制作乘法聚合运算符?

原来有一个超级简单快捷的破解方法!回到高中数学 class,给定一些 {a0、a1、a2, ..., an} 其中所有 ai > 0 (这是一个大问题! 我们需要所有的输入都是正的,否则自然对数是不确定的!),我们知道

exp(ln(a0) + ln(a1) + ... + ln(an)) = exp(ln(a0))exp(ln(a1))...exp (ln(an)) = a0a1a2...an

其中 ln(x) 是 x 的自然对数,exp(x) 是欧拉数的 x 次方。但这正是我们想要的!更好的是,presto 内置了函数 exp()、sum() 和 ln(),因此我们只需编写

SELECT exp(sum(ln(column1))) AS product FROM yourtable;

瞧!