为了减少两个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)
为了减少两个RDD连接过程中的混乱,
令人惊讶的常见误解是,重新分配会减少甚至消除洗牌。它没有。重新划分是最纯粹的形式。它不会节省时间,带宽或内存。
使用主动分区程序背后的基本原理是不同的 - 它允许您一次洗牌并重用状态,以执行多个按键操作,而无需额外的混洗(尽管据我所知,不一定没有额外的网络流量,as co-partitioning doesn't imply co-location,排除在单一行动中发生洗牌的情况)。
所以你的代码是正确的,但是如果你加入一次就不会给你买任何东西。