欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

在Spark中理解 sortBy 排序:方法与算子的区别详解

最编程 2024-02-16 17:42:38
...

Scala中有排序函数

(1)sorted

对一个集合进行自然排序,通过传递隐式的Ordering

(2)sortBy

对一个属性或多个属性进行排序,通过它的类型。

(3)sortWith

基于函数的排序,通过一个comparator函数,实现自定义排序的逻辑。

Scala中有对Value的排序算子 sortBy

1)函数签名:

def sortBy[K]( f: (T) => K,

      ascending: Boolean = true, // 默认为正序排列,从小到大,false:倒序

      numPartitions: Int = this.partitions.length)

      (implicit ord: Ordering[K], ctag: ClassTag[K]): RDD[T]

返回值是T,数字不会变

2)功能说明

该操作用于排序数据。在排序之前,可以将数据通过f函数进行处理,之后按照f函数处理的结果进行排序,默认为正序排列。排序后新产生的RDD的分区数与原RDD的分区数一致。

3)需求说明:创建一个RDD,按照数字大小分别实现正序和倒序排序



两个sortby在Spark编程中的应用

若一个Rdd的Vaule类型为 Iterable,需要将其转为List在采用scala的sortby方法或者sortWith

groupRDD: RDD[(String, Iterable[(String, Int)])]

eg:对groupRdd每个key的value从大到小取前三位,此处采用MapValues对Value进行操作

将 Iterable转为List再使用sortBy或者sortWith方法

val resultRdd: RDD[(String, List[(String, Int)])] = groupRDD.mapValues(

//sortBy写法

data => {  data.toList.sortBy(_._2)(Ordering[Int].reverse).take(3)}

//sortWith写法

value => { value.toList.sortWith( (x, y) => (x._2 > y._2) )}.take(3)}

)

若一个Rdd的Vaule类型不为 Iterable,可以直接使用Spark的sortBy算子

val resultRdd2: RDD[(String, (Int, Int, Int))]

对resultRdd2的value进行排序,resultRdd2的第二位是Int类型的三元组,默认从元祖第一位开始比较

此处采用sortBy算子

val result: Array[(String, (Int, Int, Int))] = resultRdd2.sortBy(_._2,false).take(3)

//结果打印 result.foreach(println) 


总结

sortBy方法与sortBy算子常用于再Spark编程Rdd的排序中

若排序对象是 Iterable需要将其转为List再使用SortBy方法

若排序对象是 基本的集合类型需要可以直接用SortBy算子

注意SortBy方法中逆序采用柯里化(Ordering[Int].reverse)

SortBy算子则直接(,false)即可

推荐阅读