gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:37:55 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com