版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25908611/article/details/80573448
spark 自定义排序
一、为什么要自定义排序?
在spark中,利用rdd的sortBy函数进行排序,我们只能单一对某个元素,然而这并不能解决工作中的实际业务,所以今天整理一个简单自定义的排序的类来解决这个问题。
二、定义要素
1、定义一个类,继承Ordered
2、实现Serializable序列化
3、重写compare方法
三、上代码
import org.apache.spark.{SparkConf, SparkContext}
object CustomSort extends App {
val conf = new SparkConf().setAppName("CustomSort").setMaster("local")
val sc = new SparkContext(conf)
val rdd = sc.parallelize(List(("tom",90,21,1),("jack",88,23,2),("jay",92,25,3),("peate",82,22,4)))
//原有的sortBy进行单元素操作
val sortBy = rdd.sortBy(_._3,false)
//自定义
val mySortRdd = rdd.sortBy(x => MySort(x._2,x._3),false)
println(sortBy.collect().toList)
println(mySortRdd.collect().toList)
}
//对faceValue和age进行分别比较,先按age,再按faceValue进行排序
case class MySort(val faceValue:Int,val age:Int) extends Ordered[MySort] with Serializable{
override def compare(that: MySort): Int = {
if(this.faceValue == that.faceValue){
that.age - that.age
}else{
this.faceValue - that.faceValue
}
}
}
执行结果如下: