我是 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
。您可能想了解更多相关内容。
在这种情况下,您可以用 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.
关于scala - 如何在 Spark/Scala 中对数据集的列求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28493721/