使用自定义分区程序从集合创建JavaPairRDD

时间:2016-07-20 02:50:57

标签: apache-spark partitioning rdd

是否可以使用指定的分区程序从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更快,但是,它不是一个理想的解决方案。

0 个答案:

没有答案