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)即可










网友评论