如何汇总 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
。您可能想了解更多相关信息。
这种情况下,可以用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.
我是 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.