spark两种自定义排序方式

本文介绍如何使用Scala通过两种方式实现自定义排序:一是利用隐式转换函数,二是让目标对象实现Ordered特质。这两种方法均可应用于特定类型的数据排序,如按学生年龄升序、成绩降序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、目标对象添加隐式转换函数的方式实现自定义排序

object MySort{
  //为student类添加隐式转换函数
  implicit val stuOrdering = new Ordering[student]{
    override def compare(x: student, y: student) = {
      //自定义排序格式为:默认按年龄升序排序,当年龄相同时,按分数降序排序
      if(x.age != y.age){
        x.age - y.age
      }else{
        y.score - x.score
      }
    }
  }
}

/**
  * 隐式转换函数实现自定义排序
  */
object CustomSort1{
  def main(args: Array[String]): Unit = {
    //1.创建配置对象
    val conf = new SparkConf().setAppName("sort1").setMaster("local[2]");
    //2.创建集群入口类对象
    val sc = new SparkContext(conf);

    //3.并行化的方式生成rdd
    val rdd = sc.parallelize(Array(("tom",24,92),("ko",24,97),("mark",28,88),("jack",18,86)))

    //4.对数据进行排序
    //引入隐式转换函数
    import MySort.stuOrdering
    val resRdd = rdd.sortBy(x => student(x._1,x._2.toInt,x._3.toInt))

    //5.打印排序后的结果数据
    println(resRdd.collect().toBuffer)


  }
}
//学生类
case class student(name:String,age:Int,score:Int)

二、目标对象实现Ordered特质的方式实现自定义排序

object CustomSort2{
  def main(args: Array[String]): Unit = {
    //1.创建配置对象
    val conf = new SparkConf().setAppName("sort2").setMaster("local[2]");
    //2.创建集群入口类对象
    val sc = new SparkContext(conf);

    //3.并行化的方式生成rdd
    val rdd = sc.parallelize(Array(("tom",24,92),("ko",24,97),("mark",28,88),("jack",18,86)))

    //4.对数据进行排序
    val resRdd = rdd.sortBy(x => student2(x._1,x._2.toInt,x._3.toInt))

    //5.打印排序后的结果数据
    println(resRdd.collect().toBuffer)

  }
}

case class student2(name:String,age:Int,score:Int) extends Ordered[student2]{

  override def compare(that: student2): Int = {
    if(this.age != that.age){
      this.age - that.age
    }else{
      that.score - this.score
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bokzmm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值