[英]How to merge two RDDs in Spark if value stored at a key matches
可以说我有2个RDDs
:
rdd1 = [ (key1, value1), (key2, value2), (key3, value3) ]
rdd2 = [ (key4, value4), (key5, value5), (key6, value6) ]
而且,我仅当且仅当存储在rdd1的key1中的值==存储在rdd2的key5中的值时才合并rdds。
我将如何使用Java或Scala在Spark中进行操作?
我认为您正在寻找加入。
您需要做的第一件事就是将它们映射到PairRDD,并以key1,key2等作为键。 本示例使用Tuple2作为输入:
JavaPairRDD<Integer, String> pairRdd = rdd.mapToPair(new PairFunction<Tuple2<Integer, String>, Integer, String>() {
public Tuple2<Integer, String> call(Tuple2<Integer, String> val) throws Exception {
return new Tuple2<Integer, String>(val._1(), val._2());
}
});
映射完两者后,只需按以下键即可将它们加入:
JavaPairRDD<Integer, Tuple2<String, String>> combined = pairRdd.join(pairRdd2);
然后,合并将类似于:
[ (key1, (value1, value5)), (key2, (value2, value4)) ]
其中key1 == key5和key2 == key4
我给你的解决方案如下
scala> val rdd1 = sc.parallelize(List((3,"s"),(2,"df"),(1,"i")))
scala> val rdd2 = sc.parallelize(List((1,"ds"),(2,"h"),(1,"i")))
scala> val swaprdd1=rdd1.map(_.swap)
scala> val swaprdd2=rdd2.map(_.swap)
scala> val intersectrdd = rdd1.intersection(rdd2)
scala> val resultrdd = intersectrdd.map(_.swap)
我希望它对您的解决方案有所帮助:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.