Presto - 获取数组元素的总和



我正在使用雅典娜并试图获得双精度数组元素的总和,但reduce函数似乎仅适用于整数:

SELECT reduce(ARRAY [5.0, 20.0, 50.4], 0, (s, x) -> s + x, s -> s);

将抛出错误:

Unexpected parameters (array(double), integer, com.facebook.presto.sql.analyzer.TypeSignatureProvider@762f0fa7, com.facebook.presto.sql.analyzer.TypeSignatureProvider@29dfe267) for function reduce. Expected: reduce(array(T), S, function(S,T,S), function(S,R)) T, S, R

有没有办法做到这一点?

这是Presto中的一个已知错误。您可以跟踪 https://github.com/prestosql/presto/issues/2760。

作为解决方法,您可以将array(decimal(..))转换为array(decimal(38,..))array(double)

presto> SELECT reduce(cast(ARRAY[5.0, 20.0, 50.4] as array(decimal(38,5))), 0, (s, x) -> s + x, s -> s);
_col0
----------
75.40000
presto> SELECT reduce(cast(ARRAY[5.0, 20.0, 50.4] as array(double)), 0, (s, x) -> s + x, s -> s);
_col0
-------
75.4

Athena 基于较旧的 Presto 版本(目前为 .172,已有 3 年历史(,显然上述内容在 Athena 中都不起作用(基于您的数组已经array(double)的事实(。

看起来不干净,但我找到了一种方法来让它工作:

SELECT reduce(ARRAY [5.0, 20.0, 50.4],
CAST(ROW(0.0, 0) AS ROW(sum DOUBLE, count INTEGER)),
(s, x) -> CAST(ROW(x + s.sum, s.count + 1) AS ROW(sum DOUBLE, count INTEGER)),
s -> IF(s.count = 0, NULL, s.sum));

相关内容

  • 没有找到相关文章

最新更新