spark transform系列__sortByKey

本文深入探讨了Spark中的sortByKey函数,它按照键进行排序并生成SHUFFLE RDD。在排序前,sortByKey会进行数据取样。示例展示了如何使用自定义排序规则。该操作涉及RangePartitioner,它根据指定的分区数和排序顺序来分布数据。RangePartitioner首先获取样本,然后根据样本调整分区,确保平衡。通过对样本的Bernoulli取样,处理不平衡的分区。最后,通过排序和二分查找确定键的分区位置。
摘要由CSDN通过智能技术生成

该函数主要功能:通过指定的排序规则与进行排序操作的分区个数,对当前的RDD中的数据集按KEY进行排序,并生成一个SHUFFLEdrdd的实例,这个过程会执行shuffle操作,在执行排序操作前,sortBy操作会执行一次到两次的数据取样的操作,取出RDD中每个PARTITION的部分数据,并根据进行分区的partition的个数,按key的compare大小把某个范围内的key放到一个指定的partition中进行排序.

该函数的操作示例:

import org.apache.spark.SparkContext._
*
*   val rdd: RDD[(String, Int)] = ...
*   implicit val caseInsensitiveOrdering = new Ordering[String] {
*     override def compare(a: String, b: String) =  

         a.toLowerCase.compare(b.toLowerCase)
*   }
*
*   // Sort by key, using the above case insensitive ordering.
*   rdd.sortByKey()

 

上面的示例中定义implicit的隐试转换,

  在OrderedRDDFunctions通过private val ordering implicitly[Ordering[K]]引用

 

函数定义,由OrderedRDDFunctions类进行函数的实现:

这个函数中,传入两个参数,ascending表示是升序还是降序,默认true表示升序.

第二个参数是执行排序使用的partition的个数,默认是当前RDD的partition个数.

def sortByKey(ascending: Boolean truenumPartitions: Int = self.partitions.length)
    : RDD[(KV)] = self.withScope
{

生成执行分区操作的算子,这里生成的算子不再是默认的Hash算子,而是Range的算子,这个算子后面进行具体的分析.
  val part = new RangePartitioner(numPartitionsselfascending)

这里重新根据当前的RDD,生成一个新的RDD,这个shuffle的rdd中,不包含aggregator聚合函数.

也就是在shuffle的过程中只是把key对应的值hash到对应的partition中,并根据key执行排序操作.
  new ShuffledRDD[KVV](selfpart)
    .setKeyOrdering(if (ascending) ordering else ordering.reverse)
}

 

接下来看看RangePartitioner的排序算子的实现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值