我有两个JavaRDD<Double>
名为rdd1
和rdd2
,我想评估一些相关性,例如与Statistics.corr()
。这两个RDD是通过许多转换和动作生成的,但在过程结束时,它们都具有相同数量的元素。我知道必须遵守两个条件才能评估相关性,这与相关函数中使用的zip
方法有关(据我所知)。条件是:
此外,根据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中重新分配分区(我或多或少知道分区系统的工作原理,我知道这可能会从分发点复杂化视图)?
答案 0 :(得分:0)
好的,这对我有用:
Statistics.corr(rdd1.repartition(8), rdd2.repartition(8))