在ApacheSPark中,为什么RDD.Union不保存分区器?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (218)

正如大家都知道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来使用相同的分区键?

提问于
用户回答回答于

union是一个非常有效的操作,因为它不会移动任何数据。如果rdd1具有10个分区并且rdd2具有20个分区,rdd1.union(rdd2)则将具有30个分区:两个RDD的分区彼此接连放置。这只是一个簿记变化,没有洗牌。

但它一定会丢弃分区器。分区器是为给定数量的分区构建的。由此产生的RDD有许多不同于rdd1和的分区rdd2

参加联合后,可以运行repartition

上面有一个例外。如果rdd1并且rdd2具有相同的分区程序(具有相同数量的分区),则union行为会有所不同。它将逐个加入两个RDD的分区,并为每个输入分配相同数量的分区。这可能涉及移动数据(如果分区不在同一地点),但不涉及洗牌。在这种情况下,分区程序被保留。(代码为PartitionerAwareUnionRDD.scala。)

扫码关注云+社区

领取腾讯云代金券