Spark Core 实现排序的三种方式

一、普通的实现方式


    val data: RDD[String] = sc.parallelize(Array("aa 200 3000", "bb 200 4000", "cc 999 3000", "dd 10 20000"))
    data.map(x => {
      val splits: Array[String] = x.split(" ")
      val name: String = splits(0)
      val price: Int = splits(1).toInt
      val store: Int = splits(2).toInt
      (name, price, store)
    }).sortBy(x => (-x._2, -x._3)).foreach(println(_))

二、自定义类, 实现Order方法


    val data: RDD[String] = sc.parallelize(Array("aa 200 3000", "bb 200 4000", "cc 999 3000", "dd 10 20000"))
    data.map(x => {
      val splits: Array[String] = x.split(" ")
      val name: String = splits(0)
      val price: Int = splits(1).toInt
      val store: Int = splits(2).toInt
      ProduceCaseClass(name, price, store)
    }).sortBy(x => x).foreach(println(_))

case class ProduceCaseClass(val name:String, val price: Int, val store: Int)
extends Ordered[ProduceCaseClass] with  Serializable {
  override def compare(that: ProduceCaseClass): Int = {
    this.price - that.price
  }
  override def toString: String = s"$name $price $store"
}

三、利用隐式转换,对普通的、不带比较规则的class进行排序


    val data: RDD[String] = sc.parallelize(Array("aa 200 3000", "bb 200 4000", "cc 999 3000", "dd 10 20000"))
    implicit def produceClass2Ordered(produceClass: ProduceClass): Ordered[ProduceClass] = new Ordered[ProduceClass]{
      override def compare(that: ProduceClass): Int = {
        that.price - produceClass.price
      }
    }

      data.map(x => {
          val splits: Array[String] = x.split(" ")
          val name: String = splits(0)
          val price: Int = splits(1).toInt
          val store: Int = splits(2).toInt
          new ProduceClass(name, price, store)
        }).sortBy(x => x).foreach(println(_))

class ProduceClass(val name:String, val price: Int, val store: Int)  extends Serializable {
  override def toString: String = s"$name $price $store"
}

转载于:https://my.oschina.net/dreamness/blog/3094234

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值