Как всем известно, разделители в Spark оказывают огромное влияние на производительность любых «широких» операций, поэтому обычно они настраиваются в операциях. Я экспериментировал со следующим кодом:
val rdd1 =
sc.parallelize(1 to 50).keyBy(_ % 10)
.partitionBy(new HashPartitioner(10))
val rdd2 =
sc.parallelize(200 to 230).keyBy(_ % 13)
val cogrouped = rdd1.cogroup(rdd2)
println("cogrouped: " + cogrouped.partitioner)
val unioned = rdd1.union(rdd2)
println("union: " + unioned.partitioner)
Я вижу, что по умолчанию cogroup()
всегда дает RDD с настроенным разделителем, но union()
нет, он всегда возвращается к умолчанию. Это противоречит здравому смыслу, поскольку мы обычно предполагаем, что PairRDD должен использовать свой первый элемент в качестве ключа раздела. Есть ли способ «заставить» Spark объединить 2 PairRDD для использования одного и того же ключа раздела?