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

时间:2019-03-21 11:54:15

标签: scala apache-spark rdd partitioner

为了减少在两个RDD联接期间的改组,我决定首先使用HashPartitioner对其进行分区。这是我的方法。我做对了吗,还是有更好的方法呢?

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

2 个答案:

答案 0 :(得分:3)

  

为减少两个RDD合并期间的混洗,

令人惊讶的普遍误解是,重新分配减少或什至消除了洗牌。 不是。重新分区是最原始形式的shuffle 。它不会节省时间,带宽或内存。

使用主动分区器的基本原理不同-它允许您随机洗一次,并重复使用状态,执行多个按键操作,而无需进行其他随机洗(据我所知) ,不一定没有额外的网络流量,as co-partitioning doesn't imply co-location,但单个操作中发生乱序的情况除外)。

所以您的代码是正确的,但是一旦您加入却一无所获。

答案 1 :(得分:0)

请仅发表一条评论,如果.persist().partitionBy有多个动作,最好在rddApartitioned后面附加rddBpartitioned,否则,所有动作将评估的整个血统rddApartitionedrddBpartitioned,这将导致哈希分区一次又一次地发生。

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