Met*_*est 1 scala partitioner apache-spark rdd
为了减少加入两个 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)
Run Code Online (Sandbox Code Playgroud)
为了减少加入两个 RDD 期间的混洗,
令人惊讶的是,重新分区会减少甚至消除洗牌,这是一种常见的误解。它没有。重新分区是最纯粹形式的shuffle。它不会节省时间、带宽或内存。
使用主动分区器背后的基本原理是不同的 - 它允许您洗牌一次,并重用状态,以执行多个按键操作,而无需额外的洗牌(尽管据我所知,不一定没有额外的网络流量,因为 co -partitioning 并不意味着 co-location,不包括在单个动作中发生 shuffle 的情况)。
所以你的代码是正确的,但在你加入的情况下,它不会给你买任何东西。