dataframe - 数组列中所有元素的总和
问题描述
我是 spark 新手,并且有一个用例来查找列中所有值的总和。每列都是一个整数数组。
df.show(2,false)
+------------------+
|value |
+------------------+
|[3,4,5] |
+------------------+
|[1,2] |
+------------------+
要找到的值 3 + 4 + 5 + 1 + 2 = 15
有人可以帮助/指导我如何实现这一目标吗?
编辑:我必须在 spark 2.3 中运行此代码
解决方案
一种选择是array
对每一行求和,然后计算总和。这可以通过aggregate
Spark 2.4.0 版提供的 Spark SQL 函数来完成。
val tmp = df.withColumn("summed_val",expr("aggregate(val,0,(acc, x) -> acc + x)"))
tmp.show()
+---+---------+----------+
| id| val|summed_val|
+---+---------+----------+
| 1|[3, 4, 5]| 12|
| 2| [1, 2]| 3|
+---+---------+----------+
//one row dataframe with the overall sum. collecting to a scalar value is possible too.
tmp.agg(sum("summed_val").alias("total")).show()
+-----+
|total|
+-----+
| 15|
+-----+
另一种选择是使用explode
. 但请注意,这种方法会产生大量需要汇总的数据。
import org.apache.spark.sql.functions.explode
val tmp = df.withColumn("elem",explode($"val"))
tmp.agg(sum($"elem").alias("total")).show()
推荐阅读
- java - 如何在linux上使用documents4j?
- c++ - 为什么打印“OK”会改变输出?
- android - 社交网络图标未在 android 中显示中心
- google-cloud-platform - 使用用户帐户凭据访问私有 Cloud Run/Cloud Functions
- php - Laravel Eloquent - 编写基于相关对象的选择查询
- python - 在窗口模式下使用 pyinstaller 编译时“无法执行脚本 pyi_rth_pkgres”
- git - git svn clone 用于非标准布局
- c++ - Windows std::fstream 在 open() 之后修改文件?
- node.js - 需要一个支持 unGzip 的 request-promise 替代方案
- reactjs - 如何解决 React 应用程序上的打字稿错误