Spark系列五:Spark经典案列之使用各种方法实现自定义排序

该博客详细介绍了在Spark中实现自定义排序的六种方法,包括继承Ordered、只传入排序属性、使用case class、利用隐式类、元组比较规则以及不改变原有结构的排序方式。针对特定的排序规则(颜值降序,年龄升序),提供了多种解决方案。
摘要由CSDN通过智能技术生成

目录

概述

方案汇总

方法一

方法二

方法三

方法四

方法五

方法六


概述

总体需求:Array("laoduan 30 99", "laozhao 29 9999", "laozhang 28 98", "laoyang 28 99")

排序规则:首先按照颜值的降序,如果颜值相等,再按照年龄的升序。下面列举了各种排序思路。

方案汇总

方法一

建了一个user类,继承了Ordered,里面的参数是整个user,实现了Serializable,因为要进行网络传输,将所有属性全部传进来,重写compare方法,实现排序。

object CustomSort1 {

  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setAppName("CustomSort1").setMaster("local[*]")
    val sc = new SparkContext(conf)
    val users= Array("laoduan 30 99", "laozhao 29 9999", "laozhang 28 98", "laoyang 28 99")  //三个属性分别是:姓名,年龄,属性。排序规则:首先按照颜值的降序,如果颜值相等,再按照年龄的升序
    val lines: RDD[String] = sc.parallelize(users)  //将Driver端的数据并行化变成RDD
    val userRDD: RDD[User] = lines.map(line => {   //切分整理数据
      val fields = line.split(" ")
      val name = fields(0)
      val age = fields(1).toInt
      val fv = fields(2).toInt
      new User(name, age, fv)
    })
    val sorted: RDD[User] = userRDD.sortBy(u => u) //将RDD里面装的User类型的数据进行排序
    val r = sorted.collect()
    println(r.toBuffer)
    sc.stop()
  }
}


class User(val name: String, val age: Int, val fv: Int) extends Ordered[User] with Serializable {

  override def compare(that: User): Int = {
    if(this.fv == that.fv) {
      this.age - that.age
    } else {
      -(this.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值