spark的排序方法

今天我们来介绍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{

}
原文地址:https://www.cnblogs.com/wnbahmbb/p/6247197.html