代码之家  ›  专栏  ›  技术社区  ›  daydayup

Java Spark广播并连接两个RDD

  •  0
  • daydayup  · 技术社区  · 6 年前

    JavaPairRDD<String, MySchema> RDD1 ,和一个较小的 JavaPairRDD<String, Double> RDD2 . 我想加入这两个RDD,我知道最好的方法是 RDD2

    // 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 回复  |  直到 6 年前
        1
  •  3
  •   mahmoud mehdi    6 年前

    假设您有两个要加入的RDD,第一个RDD足够小,可以放入每个工作者的内存中( ),而第二个根本不需要洗牌( ).

    在加入之前,您必须确保将大型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))
     }
    }
    

    我希望有帮助