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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值