关于Spark中 sortByKey被划分到transformation中,却有action操作原因

注意有可能会成为面试题。


在Spark 1.4 中 关于sortByKey 源码如下:


/**
   * Sort the RDD by key, so that each partition contains a sorted range of the elements. Calling
   * `collect` or `save` on the resulting RDD will return or output an ordered list of records
   * (in the `save` case, they will be written to multiple `part-X` files in the filesystem, in
   * order of the keys).
   */
  // TODO: this currently doesn't work on P other than Tuple2!
  def sortByKey(ascending: Boolean = true, numPartitions: Int = self.partitions.length)
      : RDD[(K, V)] = self.withScope
  {
    val part = new RangePartitioner(numPartitions, self, ascending)
    new ShuffledRDD[K, V, V](self, part)
      .setKeyOrdering(if (ascending) ordering else ordering.reverse)
  }



针对注释大致翻译是这样的:


通过RDD的Key 来进行排序,使每个分区包含的元素的排序范围内。调用collect或save 方法,RDD 将返回或输出的有序的记录列表。(在`情况下,它们将被写入到多个'part-X`文件在文件系统中, 为这些 keys


当我们调用 sortByKey 这个方法的时候,其中有两个可选参数。并且都带有默认值:

ascending:排序的方向,默认为true,表示升序排列。


ascending: Boolean = true, 

numPartitions:分区数,默认为原分区数

numPartitions: Int = self.partitions.length



在方法内部有这样一句话: 

val part = new RangePartitioner(numPartitions, self, ascending)

注意这里,原因就是这里:实例化了一个RangePartitioner对象,在RangePartitioner中,在Range数据分片的时候,内部进行排序,它需要对所有分区的的数据进行扫描和范围的划分,(就好比二叉树的算法)

官方将sortByKey划分到transformation了。


其他就自行查看源码去学习吧!

你可能感兴趣的:(spark)