Java Spark广播并加入两个RDD

时间:2018-07-24 21:47:37

标签: apache-spark join rdd broadcast

我有一个大表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? 

1 个答案:

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

我希望对您有帮助