如何根据另一个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)
答案 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))}