我是 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/