gpt4 book ai didi

apache-spark - 在 Apache Spark 中,为什么 RDD.union 不保留分区器?

转载 作者:行者123 更新时间:2023-12-03 11:11:12 25 4
gpt4 key购买 nike

众所周知,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对数据进行洗牌并按键组织。

上述情况有一个异常(exception)。如 rdd1rdd2具有相同的分区器(具有相同的分区数),union行为不同。它将成对地连接两个 RDD 的分区,使其具有与每个输入相同数量的分区。这可能涉及移动数据(如果分区不在同一位置),但不会涉及洗牌。在这种情况下,将保留分区程序。 (此代码在 PartitionerAwareUnionRDD.scala 中。)

关于apache-spark - 在 Apache Spark 中,为什么 RDD.union 不保留分区器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29977526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com