scala - 总结数据框中所有行的列值 - scala/spark

标签 scala apache-spark dataframe

我是 scala/spark 的新手。我正在 spark 上开发一个 scala/java 应用程序,试图从配置单元表中读取一些数据,然后对每一行的所有列值求和。例如考虑以下 DF:

+--------+-+-+-+-+-+-+
| address|a|b|c|d|e|f|
+--------+-+-+-+-+-+-+
|Newyork |1|0|1|0|1|1|
|   LA   |0|1|1|1|0|1|
|Chicago |1|1|0|0|1|1|
+--------+-+-+-+-+-+-+

我想对所有行中的所有 1 求和并得到总数。即上面数据帧的所有列的总和应该是 12(因为所有行中有 12 个 1)

我试过这样做:

var count = 0
DF.foreach( x => {
    count = count + Integer.parseInt(x.getAs[String]("a")) + Integer.parseInt(x.getAs[String]("b")) + Integer.parseInt(x.getAs[String]("c")) + Integer.parseInt(x.getAs[String]("d")) + Integer.parseInt(x.getAs[String]("e")) + Integer.parseInt(x.getAs[String]("f")) 
})

当我运行上面的代码时,count 值仍然是。我认为这与在集群上运行应用程序有关。因此,声明一个变量并添加到它对我不起作用,因为我必须在集群上运行我的应用程序。我还尝试在单独的 Java 类中声明静态变量并添加到它 - 这给了我相同的结果。

据我所知,使用 spark/scala 库中可用的内联函数应该有一种简单的方法来实现这一点。

实现此目标的有效方法是什么?任何帮助将不胜感激。

谢谢。

附言:我使用的是 Spark 1.6。

最佳答案

您可以先对列值求和,这会返回一个 sum 的 Row 数据帧,然后您可以将此 Row 转换为 Seq 并对值求和:

val sum_cols = df.columns.tail.map(x => sum(col(x)))    
df.agg(sum_cols.head, sum_cols.tail: _*).first.toSeq.asInstanceOf[Seq[Long]].sum
// res9: Long = 12

df.agg(sum_cols.head, sum_cols.tail: _*).show
+------+------+------+------+------+------+
|sum(a)|sum(b)|sum(c)|sum(d)|sum(e)|sum(f)|
+------+------+------+------+------+------+
|     2|     2|     2|     1|     2|     3|
+------+------+------+------+------+------+

关于scala - 总结数据框中所有行的列值 - scala/spark,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46992830/

相关文章:

java - Scala 的 BDD 工具支持可重用的参数化 Gherkin 子句

scala - 在 Scala 中拦截套接字关闭上的 Akka HTTP WebSocket 事件

scala - 如何在 sbt 中排除 META-INF/*.RSA', 'META-INF/*.SF' ,'META-INF/*.DSA'

r - 汇总多个因子变量的水平

python - 移动所有列的数据帧值以使其单调递增

scala - 无法更新项目 '120' : HTTP 403 Forbidden 的 Gitlab 提交状态

scala - 用宏写数组填充

python - 通过 Python 实现 Spark 和 Cassandra

apache-spark - spark中有没有像hadoop中mapreduce的cleanup函数一样的函数?

python-3.x - 将数据框“扩展”为矩阵索引