如何汇总 Spark/Scala 中数据集的列?

How to sum up columns of a dataset in Spark/Scala?

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