众所周知,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
and rdd2
.
加入工会后你可以运行repartition
打乱数据并按键组织它。
上述情况有一个例外。如果rdd1
and rdd2
具有相同的分区器(具有相同数量的分区),union
行为不同。它将成对连接两个 RDD 的分区,为其提供与每个输入相同数量的分区。这可能涉及移动数据(如果分区不是位于同一位置),但不会涉及洗牌。在这种情况下,分区器被保留。 (此代码位于PartitionerAwareUnionRDD.scala https://github.com/apache/spark/blob/v1.3.1/core/src/main/scala/org/apache/spark/rdd/PartitionerAwareUnionRDD.scala.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)