基于位于另一个RDD中的键替换RDD中的值

时间:2016-01-18 21:41:38

标签: dictionary apache-spark substitution

如何根据另一个RDD中的键分配/映射RDD中的值

e.g。从:

开始    
val rdd1 = sc.parallelize(Seq((1, "A"), (2, "B")))
val rdd2 = sc.parallelize(Seq(("A", "B"), ("B", "B"), ("B", "A")))

我怎样才能得到这样的东西?

(1,2)(2,2)(2,1)

2 个答案:

答案 0 :(得分:1)

将rdd1作为查找表(如字典)广播,然后在rdd2 map中使用广播查找表

rdd1_local = sc.parallelize([(1,"A"),(2,"B")]).map(lambda x:(x[1],x[0])).collectAsMap()
rdd1_broadcast = sc.broadcast(rdd1_local)
rdd2 = sc.parallelize([("A", "B"), ("B", "B"), ("B", "A")])
rdd2.map(lambda x:(rdd1_broadcast.value[x[0]],rdd1_broadcast.value[x[1]])).take(2)

答案 1 :(得分:0)

Scala版本:

val rdd1 = sc.parallelize(Seq((1, "A"), (2, "B")))
val rdd2 = sc.parallelize(Seq(("A", "B"), ("B", "B"), ("B", "A")))

val rdd1_broadcast = sc.broadcast(rdd1.map(x=>(x._2,x._1)).collectAsMap())
val resultRDD = rdd2.map{x=> (rdd1_broadcast.value(x._1),rdd1_broadcast.value(x._2))}