项目创建参考:http://blog.csdn.net/tototuzuoquan/article/details/74571374
package cn.toto.spark
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
* Created by toto on 2017/7/8.
*/
object OrderContext {
implicit val girlOrdering = new Ordering[Girl] {
override def compare(x: Girl, y: Girl): Int = {
if(x.faceValue > y.faceValue) 1
else if(x.faceValue == y.faceValue) {
if(x.age > y.age) -1 else 1
} else -1
}
}
}
//sort => 规则 先按faceValue,比较年龄
//name,faceValue,age
object CustomSort {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("CustomSort").setMaster("local[2]")
val sc = new SparkContext(conf)
val rdd1 = sc.parallelize(List(("yangliying",90,28,1),("gaoyuanyuan",90,27,2),("liutao",95,22,3),("yangzi",97,22,4)))
//import OrderContext._
val rdd2: RDD[(String, Int, Int, Int)] = rdd1.sortBy(x => Girl(x._2, x._3), false)
println(rdd2.collect().toBuffer)
sc.stop()
}
}
/**
* 第一种方式
* @param faceValue
* @param age
*/
case class Girl(val faceValue: Int, val age: Int) extends Ordered[Girl] with Serializable {
override def compare(that: Girl): Int = {
if(this.faceValue == that.faceValue) {
that.age - this.age
} else {
this.faceValue - that.faceValue
}
}
}
/**
* 第二种,通过隐式转换完成排序
*/
//case class Girl(falceValue:Int,age:Int) extends Serializable
运行结果是: