是否可以使用指定的分区程序从JavaPairRDD<K,V>
创建List<Tuple2<K,V>>
? JavaSparkContext中的方法parallelizePairs
仅获取切片数,并且不允许使用自定义分区程序。调用partitionBy(...)
会导致我想避免的混乱。
为什么我需要这个?假设我有rdd1
某种类型JavaPairRDD<K,V>
,它根据K
的hashCode进行分区。现在,我想从rdd2
创建另一种类型JavaPairRDD<K,U>
的{{1}},以便最终获得List<Tuple2<K,U>>
。如果rdd3 = rdd1.join(rdd2).mapValues(...)
未按rdd2
的相同方式进行分区,则rdd1
中的cogroup
调用将导致跨机器进行昂贵的数据移动。调用join
也无济于事,因为它也会调用shuffle。因此,似乎唯一的补救措施是确保使用与rdd2.partitionBy(rdd1.partitioner())
相同的分区程序创建rdd2
。有什么建议吗?
PS。如果rdd1
很小,则另一个选项是广播散列连接,即从List<Tuple2<K,U>>
制作HashMap<K,U>
,将其广播到List<Tuple2<K,U>>
的所有分区,并执行地图端连接。事实证明这比重新分区rdd1
更快,但是,它不是一个理想的解决方案。