Spark中repartition和partitionBy的区别

标签: Spark repartition partitionBy
10人阅读 评论(0) 收藏 举报
分类:

    repartition 和 partitionBy 都是对数据进行重新分区,默认都是使用 HashPartitioner,区别在于partitionBy 只能用于 PairRdd,但是当它们同时都用于 PairRdd时,结果却不一样:

    不难发现,其实 partitionBy 的结果才是我们所预期的,Why?抓狂我们打开 repartition 的源码进行查看:

def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = withScope {
	coalesce(numPartitions, shuffle = true)
}

def coalesce(numPartitions: Int, shuffle: Boolean = false)(implicit ord: Ordering[T] = null)
      : RDD[T] = withScope {
    if (shuffle) {
      /** Distributes elements evenly across output partitions, starting from a random partition. */
      val distributePartition = (index: Int, items: Iterator[T]) => {
        var position = (new Random(index)).nextInt(numPartitions)
        items.map { t =>
          // Note that the hash code of the key will just be the key itself. The HashPartitioner
          // will mod it with the number of total partitions.
          position = position + 1
          (position, t)
        }
      } : Iterator[(Int, T)]

      // include a shuffle step so that our upstream tasks are still distributed
      new CoalescedRDD(
        new ShuffledRDD[Int, T, T](mapPartitionsWithIndex(distributePartition),
        new HashPartitioner(numPartitions)),
        numPartitions).values
    } else {
      new CoalescedRDD(this, numPartitions)
    }
}

    注意到没有第15行没有,repartition 其实使用了一个随机生成的数来当做 Key,而不是使用原来的 Key!!

   使用Spark的版本为1.6.1

查看评论

Spark中repartition和coalesce的用法

小白一名,如果有错的地方希望大家指出。
  • u011981433
  • u011981433
  • 2015-11-25 13:59:56
  • 14245

Spark 重分区函数:coalesce和repartition区别与实现,可以优化Spark程序性能

源码包路径: org.apache.spark.rdd.RDD coalesce函数: 方法注释: Return a new RDDthat is r...
  • Dax1n
  • Dax1n
  • 2016-12-02 09:15:09
  • 7516

spark coalesce和repartition区别

结论: repartition是repartition特殊情况,即将原来的RDD分区数增大(会产生shuffle)。 一般用法:repartition增大分区数,repartition减少分区...
  • wwyxg
  • wwyxg
  • 2016-04-01 11:15:15
  • 1802

Spark算子:RDD键值转换操作(1)–partitionBy、mapValues、flatMapValues

partitionBy       def partitionBy(partitioner: Partitioner): RDD[(K, V)]       该函数根据partitioner函...
  • u012102306
  • u012102306
  • 2016-06-26 12:48:22
  • 8493

spark coalesce和repartition的区别

repartition(numPartitions:Int):RDD[T]和coalesce(numPartitions:Int,shuffle:Boolean=false):RDD[T] 他们两个...
  • qq_29651795
  • qq_29651795
  • 2016-11-21 15:58:14
  • 866

Spark RDD中Transformation的groupBy、partitionBy、cogroup详解

先对每个RDD中的数据进行分组,如: V1,V2会分为一组, 形成K,依次类推。 对RDD进行分区操作,如果原有的partionRDD和现有的partionRDD是一致的话就不进行分区, 否...
  • snail_gesture
  • snail_gesture
  • 2015-11-12 10:31:39
  • 3195

spark算子(repartition和coalesce)

coalescecoalesce(numPartitions:Int,shuffle:Boolean=false):RDD[T] 他们两个都是RDD的分区进行重新划分,repartition只是co...
  • weixin_35735929
  • weixin_35735929
  • 2016-11-02 11:34:50
  • 1194

Spark算子:RDD基本转换操作(2)–coalesce、repartition

coalesce def coalesce(numPartitions: Int, shuffle: Boolean = false)(implicit ord: Ordering[T] = n...
  • xiaolang85
  • xiaolang85
  • 2016-05-23 15:05:19
  • 723

Spark RDD coalesce()方法和repartition()方法

在Spark的RDD中,RDD是分区的。有时候需要重新设置RDD的分区数量,比如RDD的分区中,RDD分区比较多,但是每个RDD的数量比较小,需要设置一个比较合理的分区。或者需要把RDD的分区数量调大...
  • zhao897426182
  • zhao897426182
  • 2017-12-01 10:48:35
  • 131

Spark重新分区—repartition和coalesce的用法

转载链接:http://blog.csdn.net/u011981433/article/details/50035851 重分区函数:     repartition(numPartiti...
  • u013514928
  • u013514928
  • 2016-10-11 16:36:06
  • 3811
    个人资料
    等级:
    访问量: 17
    积分: 34
    排名: 215万+
    文章存档