如何从Spark Scala中生成的键和值对中分别添加键和值?
给出以下输入
(5,1),(6,1),(8,1)
我想获得以下输出
(19,3)
这是我到目前为止尝试过的:
val spark = SparkSession.builder.appName("myapp").getOrCreate()
val data = spark.read.textFile(args(0)).rdd
val result =
data.map { line => {
val tokens = line.split("\t")
(Float.parseFloat(tokens(4)),1)
}}.
reduceByKey( _+ _)
答案 0 :(得分:0)
reduceByKey
在这里不会达到您的目的。请使用foldLeft
。
请参阅Scala: How to sum a list of tuples以解决您的问题。
答案 1 :(得分:0)
val spark = SparkSession.builder.appName("myapp").getOrCreate()
val data = spark.read.textFile(args(0)).rdd
val result = data.map{line => {
val tokens = line.split("\t")
(tokens(4).toInt,1)
}}
.reduce((l, r) => (l._1+r._1, l._2+r._2))
foldLeft
(由Vinod Chandak建议)可能更合适,但由于我有更多经验,我倾向于使用reduce
。
答案 2 :(得分:0)
您可以使用reduce
或fold
来获得结果,还需要根据需要将token(4)
的值转换为Int
或任何其他数字类型。
val result = data.map{line => {
val tokens = line.split("\t")
(tokens(4).toInt,1)
}}
使用折页
result.fold((0,0)) { (acc, x) => (acc._1 + x._1, acc._2 + x._2)}
使用减少
result.reduce((x,y) => (x._1 + y._1, x._2 + y._2))
希望这会有所帮助!