Scala Spark - 通过为每个键添加多个值来减少RDD

时间:2015-06-12 21:24:42

标签: scala apache-spark

我有一个Spark RDD,其格式为(String,(Int,Int)),我想将Int值一起添加以创建一个(String,Int)映射。

这是我的RDD中元素的示例: res13:(String,(Int,Int))=(9D4669B432A0FD,(1,1))

我想以(String,Int)=(9D4669B432A0FD,2)的RDD结束

2 个答案:

答案 0 :(得分:5)

你应该map将值yourRdd.map(pair => (pair._1, pair._2._1 + pair._2._2)) 加到第二对的总和上:

yourRdd.map{case(str, (x1,x2)) => (str, x1+x2)}

@marios在编辑中提出了以下更好的语法:

  

或者如果你想让它更具可读性:

{{1}}

答案 1 :(得分:1)

如果有唯一键,Gabor Bakos答案是正确的。但是,如果您有多个相同的密钥,并且如果要将其减少为唯一密钥,则使用reduceByKey。

示例:

val data = Array(("9888wq",(1,2)),("abcd",(1,1)),("abcd",(3,2)),("9888wq",(4,2)))
val rdd= sc.parallelize(data)
val result = rdd.map(x => (x._1,(x._2._1+x._2._2))).reduceByKey((x,y) => x+y)
result.foreach(println)

输出:

 (9888wq,9)
 (abcd,7)