聚合 ArrayType 行由使用高阶函数的浮点数组成
Aggregating ArrayType Rows consists of Floats using Higher Order Functions
我在 Databricks 上,我有一个 table,它有一个 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 类型就可以了!但我不使用整数。我正在想办法解决这个问题。
这是可重现的 table:
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
也许我不应该坚持使用高阶函数,还有另一种不错的方法。感谢您提供解决此问题的建议。
此时 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
我在 Databricks 上,我有一个 table,它有一个 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 类型就可以了!但我不使用整数。我正在想办法解决这个问题。
这是可重现的 table:
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
也许我不应该坚持使用高阶函数,还有另一种不错的方法。感谢您提供解决此问题的建议。
此时 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