在Java Apache Spark中对齐分区中的元素数量

时间:2016-06-14 15:03:18

标签: java apache-spark partitioning partition

我有两个JavaRDD<Double>名为rdd1rdd2,我想评估一些相关性,例如与Statistics.corr()。这两个RDD是通过许多转换和动作生成的,但在过程结束时,它们都具有相同数量的元素。我知道必须遵守两个条件才能评估相关性,这与相关函数中使用的zip方法有关(据我所知)。条件是:

  1. 必须将RDD拆分为相同数量的分区
  2. 每个分区必须具有相同数量的元素
  3. 此外,根据Spark文档,我正在使用RDD上的方法来保留排序,以便最终的相关性是正确的(尽管这不会引起任何异常)。现在,问题在于即使我能够保持分区数量一致,例如使用代码

    JavaRDD<Double> rdd1Repatitioned = rdd1.repartition(rdd2.getNumPartitions());
    

    我不知道怎么做(以及什么给我例外)是控制每个分区中的条目数。我找到了一个解决方法,目前正在工作,即重新初始化我要关联的两个RDD

        List<Double> rdd1Array = rdd1.collect();
        List<Double> rdd2Array = rdd2.collect();
    
        JavaRDD<Double> newRdd1 = sc.parallelize(rdd1Array);
        JavaRDD<Double> newRdd2 = sc.parallelize(rdd2Array);
    

    但我不确定这能否保证我的一致性。其次,在某些情况下,它可能在计算方面非常昂贵。有没有办法控制每个分区中的元素数量,或者通常是在两个或多个RDD中重新分配分区(我或多或少知道分区系统的工作原理,我知道这可能会从分发点复杂化视图)?

1 个答案:

答案 0 :(得分:0)

好的,这对我有用:

Statistics.corr(rdd1.repartition(8), rdd2.repartition(8))