Spark(三)【RDD中的自定义排序】
在RDD中默认的算子sortBy,sortByKey只能真的值类型数据升序或者降序
现需要对自定义对象进行自定义排序。
一组Person对象
/**
* Person 样例类
* @param name
* @param age
*/
case class Person1(name: String, age: Int) {
override def toString = {
"name: " + name + ",age: " + age
}
val list = List(Person1("tom", 12), Person1("tom1", 13), Person1("tom2", 13))
sortBy:单Value类型RDD排序
方法一:类继承Ordered
//类继承Ordered
case class Person(name: String, age: Int) extends Ordered[Person] with Serializable {
//重写toString
override def toString = {
"name: " + name + ",age: " + age
}
//自定义排序
override def compare(that: Person): Int = {
//先按照age降序排序
var result = -this.age.compareTo(that.age)
//如果age相同,按照name升序排序
if (result == 0) {
result = this.name.compareTo(that.name)
}
result
}
}
使用
val list = List(Person("tom", 12), Person("tom1", 13), Person("tom2", 13))
val conf = new SparkConf().setAppName("RDDTest").setMaster("local[*]")
val sc = new SparkContext(conf)
sc.makeRDD(list).sortBy(x=>x).saveAsTextFile("output2")
方法二:实现Ordering
//类不需要改动
case class Person1(name: String, age: Int) {
override def toString = {
"name: " + name + ",age: " + age
}
使用
val list = List(Person1("tom", 12), Person1("tom1", 13), Person1("tom2", 13))
val rdd = sc.makeRDD(list)
//自定义排序: age降序,name升序,先按照谁排序,就放在前面 reverse:反转,降序
rdd.sortBy(person => (person.age, person.name), numPartitions = 1)(Ordering.Tuple2(Ordering.Int.reverse, Ordering.String)
, ClassTag(classOf[Tuple2[String, Int]])).saveAsTextFile("output5")
sortByKey:Key-Value类型RDD排序
只能针对key对k-v数据进行排序
方法一:类继承Ordered
同sortBy方法一,样例类继承ORdered
将单值转为K-V类型,key为Person对象。
方法二:实现Ordering
创建一个Person1类型的隐式Ordering[Person1]的比较器
import org.apache.spark.{SparkConf, SparkContext}
/**
* @description: TODO
* @author: HaoWu
* @create: 2020年08月04日
*/
object SortByKeyOrderingTest {
def main(args: Array[String]): Unit = {
//创建一个Person1类型的隐式Ordering[Person1]的比较器
implicit val ord = new Ordering[Person1] {
//自定义排序:age降序,name升序
override def compare(x: Person1, y: Person1): Int = {
//age降序
var result = -x.age.compareTo(y.age)
//name升序
if (result == 0){
result = x.name.compareTo(y.name)
}
result
}
}
val list = List(Person1("tom", 12), Person1("tom1", 13), Person1("tom2", 13))
val conf = new SparkConf().setAppName("RDDTest").setMaster("local[*]")
val sc = new SparkContext(conf)
val rdd = sc.makeRDD(list)
//转为K-V形式,按照key排序
rdd.map((_,1)).sortByKey().coalesce(1).saveAsTextFile("output")
}
}
/**
* Person 样例类
* @param name
* @param age
*/
case class Person1(name: String, age: Int) {
override def toString = {
"name: " + name + ",age: " + age
}
}
结果:
(name: tom1,age: 13,1)
(name: tom2,age: 13,1)
(name: tom,age: 12,1)
Spark(三)【RDD中的自定义排序】的更多相关文章
- php中usort自定义排序如何使用
php中usort自定义排序如何使用 一.总结 一句话总结:多写一个规则函数,而这个函数的写法和普通函数一样,调用的时候规则函数用函数名的字符串. 1.用户自定义规则函数有哪三个? usort — 使 ...
- php中数组自定义排序
php中数组自定义排序方法有很多,现在只提usort();不会保留原有键名. unsort调用方法就是unsrot($arr,func); 注意: 如果func是写在当前类中的话,那么调用的方式是 u ...
- Access中的自定义排序设置方式
一.问题起因 最近有网友提问说,Access中在用查询指定排序方式时,为什么只有升序跟降序,怎么米有自定义排序了?竟然比Excel都弱啊! 其实这是对Access的误解,我这就给大家来解一下疑惑.案例 ...
- 007_对go语言中的自定义排序sort的小练习
在go语言基础知识中,有个知识点是go语言的自定义排序,我在学习完之后,自己做了一些小练习和总结. 首先按照惯例,还是呈上代码演示: package main import "fmt&quo ...
- Lucene 中自定义排序的实现
使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们 ...
- php自定义排序数组usort和uasort(uasort保持索引关联)(usort($arr, "cmp");)(比较函数时很普通函数的写法:function cmp($a, $b))
php自定义排序数组usort和uasort(uasort保持索引关联)(usort($arr, "cmp");)(比较函数时很普通函数的写法:function cmp($a, $ ...
- Python自定义排序及我实际遇到的一些题目实例
写在前面,本文主要介绍Python基础排序和自定义排序的一些规则,如果都比较熟悉,可以直接翻到第三节,看下实际的笔试面试题中关于自定义排序的应用. 一.基础排序 排序是比较基础的算法,与很多语言一样, ...
- stl 自定义排序与删除重复元素
转: STL—vector删除重复元素 STL提供了很多实用的算法,这里主要讲解sort和unique算法. 删除重复元素,首先将vector排序. sort( vecSrc.begin(), vec ...
- Spark:将RDD[List[String,List[Person]]]中的List[Person]通过spark api保存为hdfs文件时一直出现not serializable task,没办法找到"spark自定义Kryo序列化输入输出API"
声明:本文转自<在Spark中自定义Kryo序列化输入输出API> 在Spark中内置支持两种系列化格式:(1).Java serialization:(2).Kryo seriali ...
随机推荐
- C++ map操作——插入、查找、遍历
c++ map 操作学习 #include <iostream> #include <map> #include <string> #include <vec ...
- Python AttributeError: module 'string' has no attribute 'atoi'
python2 中可以用string.atoi 在python3中会报错 替换的方案是 string.atoi(your_str) 替换为 int(your_str) 这个代码python2和pyth ...
- hdu 1754 I Hate It(单点更新,区段查最值)
题意: N个成绩.M个操作. Q a b:查询第a个到第b个成绩中最高成绩 U a b:将第a个成绩改成b 思路: 看代码,, 代码: const int maxn = 200010; int max ...
- linux 内核源代码情景分析——i386 的页式内存管理机制
可以看出,在页面目录中共有210 = 1024个目录项,每个目录项指向一个页面表,而在每个页面表中又共有1024个页面描述项. 由图看出来,从线性地址到物理地址的映射过程为: 1)从CR3取得页面目录 ...
- p->next = q, p = q->next, q->next = p->next的区别
- Robot Framework操作MySQL数据库
1.安装databaselibrary.pymysql 通过cmd命令执行:pip install robotframework-databaselibrary cmd命令执行:pip install ...
- 设计模式学习-使用go实现外观模式
外观模式 定义 适用范围 代码实现 优点 缺点 关于接口粒度的思考 参考 外观模式 定义 外观模式也叫门面模式 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接 ...
- 全面的Docker快速入门教程
前言: 都2021年了,你还在为了安装一个开发或者部署环境.软件而花费半天的时间吗?你还在解决开发环境能够正常访问,而发布测试环境无法正常访问的问题吗?你还在为持续集成和持续交付(CI / CD)工作 ...
- nrf52832蓝牙开发踩过的坑
接触nrf52832芯片已经有一段时间了,记录我踩过的坑.这些坑大多都补回来了,愿后来的开发者没有坑~ 先来点开胃小菜 一.环境问题 安装离线包遇到的错误--svdconv exited with a ...
- [loj3076]公园
为了方便,对题意做以下处理: 1.称"西部主题"和"科幻主题"分别为黑色和白色 2.删去题中"保证没有两条不同的道路连接同一对景点"的条件 ...