scala - 如何在 Spark/Scala 中对数据集的列求和?

标签 scala sum apache-spark

我是 Spark/Scala 新手。我有一个包含许多列的数据集,每列都有一个列名。给定几个列名(这些列名不是固定的,它们是动态生成的),我需要对这些列的值求和。有没有有效的方法来做到这一点?

我通过使用for循环找到了一种方法,但我认为它效率不高:

val AllLabels = List("ID", "val1", "val2", "val3", "val4")
val lbla = List("val1", "val3", "val4")
val index_lbla = lbla.map(x => AllLabels.indexOf(x))

val dataRDD = sc.textFile("../test.csv").map(_.split(","))

dataRDD.map(x=>
 {
  var sum = 0.0
  for (i <- 1 to index_lbla.length) 
    sum = sum + x(i).toDouble
  sum
 }
).collect

test.csv 如下所示(没有列名称):

"ID", "val1", "val2", "val3", "val4"
 A, 123, 523, 534, 893
 B, 536, 98, 1623, 98472
 C, 537, 89, 83640, 9265
 D, 7297, 98364, 9, 735
 ...

非常感谢您的帮助!

最佳答案

你提到的for循环只是一些高阶函数的语法糖,比如scala中的map。您可能想了解更多相关内容。

在这种情况下,您可以用 mapsum 替换 for 循环处理。

dataRDD.map(x => index_lbla.map(i => x(i).toDouble).sum).collect

// note that this also fixes the error in selecting columns for summation in the original version.

关于scala - 如何在 Spark/Scala 中对数据集的列求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28493721/

相关文章:

c++ - 可变参数模板求和运算左关联

scala - Spark : How can DataFrame be Dataset[Row] if DataFrame's have a schema

scala - 将Scala转换成golang是否可能/有用?

r - 从 sum() 和 '+' 获得不同的结果

excel - 如何在 Excel 中根据多个 If 计算总和?

docker - 工作容器无法重新连接到Spark驱动程序

java - Spark 提交错误 : Invalid maximum heap size: -Xmx4g --jars, 但系统上有足够的内存

apache-spark - Spark - 用引号读取 csv 文件

scala - akka可以使用多播地址吗?

java - Scala/java 对超过 31 天或低于 1 天的月份进行 sanitizer ?