排序-简单版
package com.ws.order
class OrderBean(val name:String,val age:Int,val fv:Double) extends Ordered[OrderBean] with Serializable {
override def compare(that: OrderBean): Int = {
if(this.fv == that.fv){
this.age.compareTo(that.age)
}else{
- this.fv.compareTo(that.fv)
}
}
override def toString = s"OrderBean($name, $age, $fv)"
}}
对象排序
package com.ws.order
import org.apache.spark.{SparkConf, SparkContext}
/**
* 排序,如果是Bean 那么可以实现 Comparator、Ordered、Ordering 三个接口之一
* 直接调用sortBy即可
*/
object Order1 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("Topn1").setMaster("local[*]")
val sc = new SparkContext(conf)
val value = sc.parallelize(Array[OrderBean](new OrderBean("zs", 18, 99.2), new OrderBean("ls", 28, 99.2), new OrderBean("ww", 31, 100)))
val value1 = value.sortBy(t => t)
println(value1.collect().toBuffer)
sc.stop()
}
}
元组排序
package com.ws.order
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
* 如果是元组,可以直接再t中指定排序规则
*/
object Order2 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("Topn1").setMaster("local[*]")
val sc = new SparkContext(conf)
val value: RDD[(String, Int, Double)] = sc.parallelize(List(("zs", 18, 99.5), ("ls", 20, 99.5), ("zs", 28, 100)))
val value1: RDD[(String, Int, Double)] = value.sortBy(x => (-x._3, x._2, x._1))
println(value1.collect().toBuffer)
sc.stop()
}
}
如果是元组,我们不需要将元组转换成对象,然后再按照对象去排序,我们直接可以在sortBy中 将原来的元组转换成对象去排 这个很重要。
反过来也一样,如果一个对象没有指定排序规则,我们可以把对象解析成元组,利用元组的默认排序规则去排(先排第一个,再排第二个)
排序-隐式转换
package com.ws.order
case class OrderBeanSimple(name:String, age:Int, fv:Double){
override def toString = s"OrderBean($name, $age, $fv)"
}
package com.ws.order
import org.apache.spark.{SparkConf, SparkContext}
/**
* 排序,如果是Bean实现 Comparator、Ordered、Ordering 方法,那么bean就和排序规则耦合在一起了,
* 如果我们用同一个bean,但是需要不同的排序规则进行排序,那么我么可以把排序规则抽取出来,用隐式转换修饰
* 导入不同的排序方法,就可以实现不同的排序
*/
object Order3Implicit {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("Topn1").setMaster("local[*]")
val sc = new SparkContext(conf)
val value = sc.parallelize(Array[OrderBeanSimple](OrderBeanSimple("zs", 18, 99.2), OrderBeanSimple("ls", 28, 99.2), OrderBeanSimple("ww", 31, 100)))
import OrderContext.sortByAge
val value1 = value.sortBy(t => t)
println(value1.collect().toBuffer)
sc.stop()
}
}