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

时间:2015-02-13 06:26:13

标签: 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
 ...

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

你提到的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.