我有一个元组的RDD,格式为(key, count)
,但有些键是等价的,即
(a,3)
(b,4)
(c,5)
应减少到...... a
和c
等效(例如)
(a,8)
(b,4)
有没有办法在Spark中执行此操作?
我在reduce()
函数中考虑某种条件?
答案 0 :(得分:1)
我认为在reduce操作中没有办法实现这一点,但您可以使用预处理步骤来实现。一种选择是创建一个链接您的密钥的Map[K,K]
。
val in = sc.parallelize(List(("a",3),("b",4),("c",5)))
val keyMap: Map[String,String] = Map[String,String]("a"->"a", "b"->"b", "c"->"a")
val out = in.map{case (k,v) => (keyMap.getOrElse(k,k),v)}.reduceByKey(_+_)
out.take(3).foreach(println)
编辑:
如果Map
无法适合驱动程序,您还可以分发查找:
val in = sc.parallelize(List(("a",3),("b",4),("c",5)))
val keyMap = sc.parallelize(List(("a","a"),("b","b"),("c"->"a")))
val out = in.join(keyMap).map{case (oldKey, (v, newKey)) => (newKey, v)}.reduceByKey(_+_)
out.take(3).foreach(println)
答案 1 :(得分:1)
reduceByKey()
可以解决这个问题,因为您的数据已经配对了。
val baseRDD = sc.parallelize(Seq(("a", 3), ("b", 4), ("a", 5)))
baseRDD.reduceByKey((accum, current) => accum + current).foreach(println)