今天我们来介绍spark中排序的操作,spark的排序很简单,我们可以直接使用sortBy来进行,这个里面我们使用case clas,使用case class的好处是1.不用newjiukeyi 搞出实例,2.模式匹配
今天我们讲的排序有两种方法,在还没开始之前,我们先说明一下需求,有一个对象Girl,他有faceValue以及年龄,我们这个里面的比较规则则是,faceValue大的在前面,如果faceValue一样大的情况下,年龄小的在前面
第一种方法,使用类extends Ordered的方法,然后在重写compare的方法
package cn.wj.spark.day05 import org.apache.spark.{SparkConf, SparkContext} /** * Created by WJ on 2017/1/4. */ object CustomSort_3 { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("CustomSort_3").setMaster("local") val sc = new SparkContext(conf) val rdd1 = sc.parallelize(List(("zhoujielun",90,28,1),("anglebaby",90,27,2),("liuyifei",95,22,3))) val rdd2 = rdd1.sortBy(x => Boy3(x._2,x._3),false) println(rdd2.collect().toBuffer) sc.stop() } } case class Boy3(val faceValue:Int,val age:Int) extends Ordered[Boy3] with Serializable{ override def compare(that: Boy3): Int = { if(this.faceValue == that.faceValue){ that.age - this.age }else{ this.faceValue - that.faceValue } } }
第二种方法,可以通过,隐式转换的方法来进行排序
package cn.wj.spark.day06 import org.apache.spark.{SparkConf, SparkContext} /** * Created by WJ on 2017/1/4. */ object OrderContext{ implicit object BoyOrdering extends Ordering[Boy5]{ override def compare(x: Boy5, y: Boy5): Int = { if(x.faceValue > y.faceValue) 1 else if(x.faceValue == y.faceValue){ if(x.age > y.age) -1 else 1 }else -1 } } } object CustomSort_5 { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("CustomSort_5").setMaster("local") val sc = new SparkContext(conf) val rdd1 = sc.parallelize(List(("zhoujielun",29,23,1),("linzhiling",29,22,5),("sunyanzi",28,10,5))) import OrderContext._ val rdd2 = rdd1.sortBy(x => Boy5(x._2,x._3),false) println(rdd2.collect().toBuffer) sc.stop() } } case class Boy5(faceValue:Int , age:Int) extends Serializable{ }