聚合 ArrayType 行由使用高阶函数的浮点数组成

Posted

技术标签:

【中文标题】聚合 ArrayType 行由使用高阶函数的浮点数组成【英文标题】:Aggregating ArrayType Rows consists of Floats using Higher Order Functions 【发布时间】:2019-04-25 10:08:12 【问题描述】:

我在 Databricks 上,我有一个表,其中有一个 values 列,行由数组组成。数组本身由浮点数组成。我需要一个总结这些数组的新列。

我受到 Databricks 博文的启发:https://databricks.com/blog/2017/05/24/working-with-nested-data-using-higher-order-functions-in-sql-on-databricks.html

我试过了:

SELECT   key,
         values,
         REDUCE(values, 0, (value, acc) -> value + acc) summed_values_simple
FROM     nested_data

但它不起作用。错误信息是关于:

due to data type mismatch: argument 3 requires int type, however, 'lambdafunction' is of float type.

如果我使用 int 类型,那么它可以工作!但我不使用整数。我正在想办法解决这个问题。

这是可重现的表:

CREATE OR REPLACE TEMPORARY VIEW nested_data AS
SELECT   id AS key,

         ARRAY(CAST(RAND(1) * 100 AS FLOAT), CAST(RAND(2) * 100 AS FLOAT), 
         CAST(RAND(3) * 100 AS FLOAT), CAST(RAND(4) * 100 AS FLOAT), CAST(RAND(5) * 100 AS FLOAT)) AS values

FROM range(5)

预期的输出应如下所示:

key values                           summed_values_simple
0   [26.3, 11.6, 66.0, 8.7,  47.6]    160.2
1   [66.0, 8.7,  47.6, 91.4, 6.4]     220.1
2   [8.7,  47.6, 91.4, 6.4,  70.6]    224.7
3   [91.4, 6.4,  70.6, 41.3, 19.8]    219.5
4   [6.4,  70.6, 41.3, 19.8, 12.0]    150.1

也许我不应该坚持使用高阶函数,还有另一种好方法。感谢您提出解决此问题的建议。

【问题讨论】:

【参考方案1】:

Spark SQL 中的高阶函数此时对类型相当挑剔,您必须确保输入和输出都符合预期的类型。

这里先CAST累加器就足够了。

SELECT *, aggregate(
  values,
  CAST(0 AS double),  -- Accumulator has to be of the same type as the input
  (value, acc) -> value + acc) summed_values_simple
FROM nested_data

【讨论】:

你太棒了!

以上是关于聚合 ArrayType 行由使用高阶函数的浮点数组成的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 中执行聚合函数时出错:ArrayType 无法转换为 org.apache.spark.sql.types.StructType

在 C 中使用英特尔内在函数加载和存储复杂的浮点数

与霓虹内在函数中的浮点数比较

如何将一个巨大的头部分配数组设置为特定的浮点数 C++

相当于elm(或javascript)中的std :: nextafter(下一个可表示的浮点数)

python中奇怪的浮点数到整数转换问题