Spark中RDD的sortBy排序的5种实现方法
在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种实现方法相关推荐
- Spark中RDD转换成DataFrame的两种方式(分别用Java和scala实现)
一:准备数据源 在项目下新建一个student.txt文件,里面的内容为: [plain] view plain copy print? <code class=&q ...
- Spark中 RDD之coalesce与repartition区别
Spark中 RDD之coalesce与repartition区别 coalesce def coalesce(numPartitions: Int, shuffle: Boolean = false ...
- Java针对ArrayList自定义排序的2种实现方法
这篇文章主要介绍了Java针对ArrayList自定义排序的2种实现方法,结合实例形式总结分析了Java操作ArrayList自定义排序的原理与相关实现技巧,下面就和动力节点java学院小编一起来看看 ...
- java代码二进制转为十六进制_Java 中二进制转换成十六进制的两种实现方法
Java 中二进制转换成十六进制的两种实现方法 每个字节转成16进制,方法1 /** * 每个字节转成16进制,方法1 * * @param result */ private static Stri ...
- Springboot中关于跨域问题的一种解决方法
Springboot中关于跨域问题的一种解决方法 参考文章: (1)Springboot中关于跨域问题的一种解决方法 (2)https://www.cnblogs.com/zishu/p/107272 ...
- PHP实现对多维数组按照某个键值排序的两种解决方法
实现对多维数组按照某个键值排序的两种解决方法(array_multisort和array_sort): 第一种: array_multisort()函数对多个数组或多维数组进行排序. //对数组$ho ...
- Spark中RDD、DataFrame和DataSet的区别与联系
一.RDD.DataFrame和DataSet的定义 在开始Spark RDD与DataFrame与Dataset之间的比较之前,先让我们看一下Spark中的RDD,DataFrame和Dataset ...
- Spark中RDD与DataFrame与DataSet的区别与联系
1.概述 这是一个面试题 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似传统数据库中的二维表格 DataFrame与RDD的主要区别在于,前者带有schema元数据信息,既 ...
- Spark 中 RDD 的详细介绍
RDD ---弹性分布式数据集 RDD概述 RDD论文 中文版 : http://spark.apachecn.org/paper/zh/spark-rdd.html RDD产生背景 为了解决开发人员 ...
最新文章
- 产品经理如何在技术人员面前更有说服力?
- VS2005工程增加SDK
- 局部图像描述子——Harris角点检测器
- 使用Comparable、Comparator接口实现对对象数组、List集合自定义排序
- 什么是初效过滤器_什么是粗效过滤器?它和初效过滤网是一样的吗?
- python如何用requests传送json格式数据
- 计算机三级 信息安全技术题库——选择题1
- 数据安全-整体解决方案
- Digi Digimesh无线自组网协议和模块介绍
- matlab中功率因数模块,最经典的功率因数控制器设计方案
- HDU1114 Piggy-Bank 完全背包
- 1.27 Cubemx_STM32H7 软\硬件I2C
- 公司注销后债务承担的法律规定
- 大唐芙蓉园-莫安迪摄影作品
- 为XV6系统扩展一个系统调用需要修改的文件
- js根据出生日期 计算岁数
- 第1条:考虑采用静态工厂方法代替构造器
- java.lang.NullPointerException
- Mac 文件直接被永久删除,而不进垃圾箱 的 解决办法
- 沙扬娜拉一首 徐志摩