通过比较减少火花

时间:2017-03-28 16:23:18

标签: apache-spark

我有一个元组的RDD,格式为(key, count),但有些键是等价的,即

(a,3)
(b,4)
(c,5)

应减少到...... ac等效(例如)

(a,8)
(b,4)

有没有办法在Spark中执行此操作?

我在reduce()函数中考虑某种条件?

2 个答案:

答案 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)