我有一个大表JavaPairRDD<String, MySchema> RDD1
和一个较小的JavaPairRDD<String, Double> RDD2
。我想加入这两个RDD,我知道最好的方法是使RDD2
为广播变量,然后加入以减少混洗。如何处理广播部分?我的意思是,广播后,我将获得一个变量(列表或集合),它不再是RDD。如何在RDD中加入广播变量?
// I ignored the parsing part, just simplified it as loading from the files.
JavaPairRDD<String, MySchema> RDD1 = sc.textFile ("path_to_small_dataset");
JavaPairRDD<String, Double> RDD2 = sc.textFile("path_to_large_dataset");
// Broadcast RDD2
Set<Tuple2<String, Double>> set2 = new HashSet<>();
set2.addAll(RDD2.collect());
// now I have set2 and RDD1, how can I join them?
答案 0 :(得分:0)
假设您有两个要加入的RDD,第一个足够小以适合每个工作人员的内存( smallRDD ),第二个不需要洗牌( largeRDD )。
在加入之前,必须确保将大的RDD [T]转换为RDD [(key,T)]。键代表联接操作期间使用的列。
此代码应该可以在Scala中解决问题(但基本原理在Java中是相同的)
val smallLookup = sc.broadcast(smallRDD.collect.toMap)
largeRDD.flatMap { case(key, value) =>
smallLookup.value.get(key).map { otherValue =>
(key, (value, otherValue))
}
}
我希望对您有帮助