为了减少在两个RDD联接期间的改组,我决定首先使用HashPartitioner对其进行分区。这是我的方法。我做对了吗,还是有更好的方法呢?
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
答案 0 :(得分:3)
为减少两个RDD合并期间的混洗,
令人惊讶的普遍误解是,重新分配减少或什至消除了洗牌。 不是。重新分区是最原始形式的shuffle 。它不会节省时间,带宽或内存。
使用主动分区器的基本原理不同-它允许您随机洗一次,并重复使用状态,执行多个按键操作,而无需进行其他随机洗(据我所知) ,不一定没有额外的网络流量,as co-partitioning doesn't imply co-location,但单个操作中发生乱序的情况除外)。
所以您的代码是正确的,但是一旦您加入却一无所获。
答案 1 :(得分:0)
请仅发表一条评论,如果.persist()
和.partitionBy
有多个动作,最好在rddApartitioned
后面附加rddBpartitioned
,否则,所有动作将评估的整个血统rddApartitioned
和rddBpartitioned
,这将导致哈希分区一次又一次地发生。
val rddApartitioned = rddA.partitionBy(new HashPartitioner(numOfPartitions)).persist()
val rddBpartitioned = rddB.partitionBy(new HashPartitioner(numOfPartitions)).persist()