如何在Spark中加入之前正确应用HashPartitioner?

问题描述 投票:1回答:1

为了减少两个RDD加入过程中的混乱,我决定先使用HashPartitioner对它们进行分区。我就是这样做的。我正确地做了,还是有更好的方法来做到这一点?

val rddA = ...
val rddB = ...

val numOfPartitions = rddA.getNumPartitions

val rddApartitioned = rddA.partitionBy(new HashPartitioner(numOfPartitions))
val rddBpartitioned = rddB.partitionBy(new HashPartitioner(numOfPartitions))

val rddAB = rddApartitioned.join(rddBpartitioned)
scala apache-spark rdd partitioner
1个回答
3
投票

为了减少两个RDD连接过程中的混乱,

令人惊讶的常见误解是,重新分配会减少甚至消除洗牌。它没有。重新划分是最纯粹的形式。它不会节省时间,带宽或内存。

使用主动分区程序背后的基本原理是不同的 - 它允许您一次洗牌并重用状态,以执行多个按键操作,而无需额外的混洗(尽管据我所知,不一定没有额外的网络流量,as co-partitioning doesn't imply co-location,排除在单一行动中发生洗牌的情况)。

所以你的代码是正确的,但是如果你加入一次就不会给你买任何东西。

© www.soinside.com 2019 - 2024. All rights reserved.