Spark入门-scala实现二次或多次排序问题

例如有个数据表结构 如:年龄 年级 姓名...

希望首先根据年龄大小进行排序,如果年龄大小相同的情况下,再考虑年级大小的情况


二次排序或多次排序:

spark中使用基本的排序一般为sortByKey方法,在进行二次排序或者多次排序时需要自己想办法解决,sortByKey方法中主要是根据key键对象实现的compare方法进行排序的,根据compare返回的Int型整数来判断对比的大小。


二次或多次排序的实现方法:

自定义对象(属性为所要参与排序的列名)

自定义对象需要继承Ordered类和Serializable(extends Ordered[T] with Serializable)

自定义对象重写 compare方法(override def compare)


二次或多次排序的使用:

数据转化为rdd后,通过map函数进行转换,转换为(自定义对象,对应一条数据)的格式,然后调用sortByKey方法进行自定义排序


代码实现:

class SecondarySort(val first:Double, val second:Double) extends Ordered[SecondarySort] with Serializable {
  override def compare(that: SecondarySort): Int = {
    if(that.first == this.first){
      return (that.second-this.second).toInt
    }else {
      return  (that.first - this.first).toInt
    }
  }
}


排序测试代码:

import org.apache.spark.sql.SparkSession

object TestSecondarySort {
  def main(args : Array[String]):Unit= {
    val spark = SparkSession.builder().master("local").getOrCreate()
    val textFile = spark.read.textFile("file:/home/enche/Downloads/access_20170504.log").rdd
    val sorted = textFile.map(line => (new SecondarySort(line.split("\t")(2).toInt, line.split("\t")(3).toInt), line))
    val result = sorted.sortByKey(ascending = true)
    result.collect.foreach(println)
  }
}

测试数据地址(来自实验楼分享):

链接: https://pan.baidu.com/s/1c1IKO0K 密码: 7kcq

你可能感兴趣的:(机器学习)