zoukankan      html  css  js  c++  java
  • 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{
    
    }
  • 相关阅读:
    SQL Server 循环插入数据
    转:Visual Studio 打开程序提示仅我的代码怎么办
    DevExpress XAF 访问当前视图中选定的对象
    DevExpress安装
    待定位的小bug
    easyui datagrid的toolbar 按钮可以像linkbutton一样设置使能状态
    使用jquery同时设置两个对象的method为同一函数
    首页变黑白的办法
    关于jQueryEasyUI DateBox的基本使用
    好东西分享兼备忘
  • 原文地址:https://www.cnblogs.com/wnbahmbb/p/6247197.html
Copyright © 2011-2022 走看看