在RDD,ortBy可以指定对键还是value进行排序,sortBy可以通过下面5中方式实现排序
假如数据的格式如下,list中元素中分别为名称、单价、数量,字符之间用空格连接,要实现按照单价和数量降序

val products = sc.parallelize(List("A 100 10","B 200 20","C 200 30","D 400 30"))

1.通过Tuple方式,按照数组的元素进行排序,代码如下

products.map(x => {val splits  = x.split(" ")val name = splits(0)val price = splits(1).toDoubleval amount = splits(2).toInt(name,price,amount)}).sortBy(x =>(-x._2,-x._3)).foreach(println)

2. 自定义一个class,继承Ordered 并混入序列化,实现排序方法

class Products(val name :String, val price:Double, val amount:Int) extends Ordered[Products] with Serializable {override def compare(that: Products) = {that.amount-that.amount}override def toString(): String = name + "\t" + price + "\t" + amount
}

在排序的时候,代码如下

 products.map(x => {val splits  = x.split(" ")val name = splits(0)val price = splits(1).toDoubleval amount = splits(2).toIntnew Products(name,price ,amount)}).sortBy(x => x).foreach(println)

3. 使用case class实现排序,推荐使用
case默认实现序列化,并重写toString、equal、hashcode方法,class代码如下

case class Products2(name: String, price : Double, amount: Int) extends Ordered[Products2]{override def compare(that: Products2) = {this.amount - that.amount}
}

在排序时,代码如下

 products.map(x => {val splits  = x.split(" ")val name = splits(0)val price = splits(1).toDoubleval amount = splits(2).toIntProducts2(name,price ,amount)}).sortBy(x => x).foreach(println)

4.使用隐式转换,实现带有排序功能的class,代码如下

    products.map(x => {val splits  = x.split(" ")val name = splits(0)val price = splits(1).toDoubleval amount = splits(2).toIntnew Products3(name,price ,amount)}).sortBy(x => x).foreach(println)implicit  def products3ToOrdered(products3:Products3) :Ordered[Products3] = new Ordered[Products3] {override def compare(that: Products3): Int = {products3.amount - that.amount}}

5.使用Ordering on 实现排序,这种方式比较优雅,但是不推荐使用
先定义class类

class Products3(val name: String, val price : Double, val amount : Int) extends Serializable {override def toString(): String = name + "\t" + price + "\t" + amount
}

在排序时,代码如下

// Ording on 语法
val product4 =  products.map(x => {val splits  = x.split(" ")val name = splits(0)val price = splits(1).toDoubleval amount = splits(2).toInt(name,price,amount)
})implicit  var ord = Ordering[(Double,Int)].on[((String, Double, Int))](x =>(-x._2,-x._3))
product4.sortBy(x=>x).foreach(println)

Spark中RDD的sortBy排序的5种实现方法相关推荐

  1. Spark中RDD转换成DataFrame的两种方式(分别用Java和scala实现)

    一:准备数据源       在项目下新建一个student.txt文件,里面的内容为:         [plain] view plain copy print? <code class=&q ...

  2. Spark中 RDD之coalesce与repartition区别

    Spark中 RDD之coalesce与repartition区别 coalesce def coalesce(numPartitions: Int, shuffle: Boolean = false ...

  3. Java针对ArrayList自定义排序的2种实现方法

    这篇文章主要介绍了Java针对ArrayList自定义排序的2种实现方法,结合实例形式总结分析了Java操作ArrayList自定义排序的原理与相关实现技巧,下面就和动力节点java学院小编一起来看看 ...

  4. java代码二进制转为十六进制_Java 中二进制转换成十六进制的两种实现方法

    Java 中二进制转换成十六进制的两种实现方法 每个字节转成16进制,方法1 /** * 每个字节转成16进制,方法1 * * @param result */ private static Stri ...

  5. Springboot中关于跨域问题的一种解决方法

    Springboot中关于跨域问题的一种解决方法 参考文章: (1)Springboot中关于跨域问题的一种解决方法 (2)https://www.cnblogs.com/zishu/p/107272 ...

  6. PHP实现对多维数组按照某个键值排序的两种解决方法

    实现对多维数组按照某个键值排序的两种解决方法(array_multisort和array_sort): 第一种: array_multisort()函数对多个数组或多维数组进行排序. //对数组$ho ...

  7. Spark中RDD、DataFrame和DataSet的区别与联系

    一.RDD.DataFrame和DataSet的定义 在开始Spark RDD与DataFrame与Dataset之间的比较之前,先让我们看一下Spark中的RDD,DataFrame和Dataset ...

  8. Spark中RDD与DataFrame与DataSet的区别与联系

    1.概述 这是一个面试题 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似传统数据库中的二维表格 DataFrame与RDD的主要区别在于,前者带有schema元数据信息,既 ...

  9. Spark 中 RDD 的详细介绍

    RDD ---弹性分布式数据集 RDD概述 RDD论文 中文版 : http://spark.apachecn.org/paper/zh/spark-rdd.html RDD产生背景 为了解决开发人员 ...

最新文章

  1. 产品经理如何在技术人员面前更有说服力?
  2. VS2005工程增加SDK
  3. 局部图像描述子——Harris角点检测器
  4. 使用Comparable、Comparator接口实现对对象数组、List集合自定义排序
  5. 什么是初效过滤器_什么是粗效过滤器?它和初效过滤网是一样的吗?
  6. python如何用requests传送json格式数据
  7. 计算机三级 信息安全技术题库——选择题1
  8. 数据安全-整体解决方案
  9. Digi Digimesh无线自组网协议和模块介绍
  10. matlab中功率因数模块,最经典的功率因数控制器设计方案
  11. HDU1114 Piggy-Bank 完全背包
  12. 1.27 Cubemx_STM32H7 软\硬件I2C
  13. 公司注销后债务承担的法律规定
  14. 大唐芙蓉园-莫安迪摄影作品
  15. 为XV6系统扩展一个系统调用需要修改的文件
  16. js根据出生日期 计算岁数
  17. 第1条:考虑采用静态工厂方法代替构造器
  18. java.lang.NullPointerException
  19. Mac 文件直接被永久删除,而不进垃圾箱 的 解决办法
  20. 沙扬娜拉一首 徐志摩

热门文章

  1. 如何使用outlook配置qq邮箱
  2. 开发板qt移植和交叉开发环境搭建学习笔记
  3. Linux命令详解(2) – mv
  4. HBase2.x_base
  5. 软件测试工程师面试如何描述自动化测试是怎么实现的?
  6. 销量破亿,董洁直播间凭何出圈?
  7. 5G未能拯救国内手机市场,手机出货量持续下滑
  8. SNMP中的MIB是什么? 讲解如何进行SNMP MIB的查看
  9. 打造自己个性的notepad ++
  10. 挺带劲!通过 Nginx 来实现封杀恶意访问