我正在使用雅典娜并试图获得双精度数组元素的总和,但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));