【问题标题】:Presto - get sum of array elementsPresto - 获取数组元素的总和
【发布时间】:2020-06-02 18:23:51
【问题描述】:

我正在使用 Athena 并尝试获取双精度数组元素的总和,但 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 amazon-athena


    【解决方案1】:

    这是 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 版本(当前为 0.172,3 岁),显然上述方法均不适用于 Athena(基于您的数组已经是 array(double) 的事实)。

    【讨论】:

    • 感谢您的帮助,正如您所提到的,代码在 Athena 上不起作用,但很高兴知道这是一个错误。
    【解决方案2】:

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

    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));
    

    【讨论】:

      猜你喜欢
      • 2020-11-02
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2019-10-31
      • 2017-09-23
      • 1970-01-01
      相关资源
      最近更新 更多