我是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
...
非常感谢您的帮助!
答案 0 :(得分:2)
你提到的for
循环只是一些高阶函数的语法糖,比如scala中的map
。您可能想要了解更多信息。
在这种情况下,您可以使用map
和sum
替换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.