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 ...
随机推荐
- 反转单词顺序列 牛客网 剑指Offer
反转单词顺序列 牛客网 剑指Offer 题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但 ...
- insertion-sort-list leetcode C++
Sort a linked list using insertion sort. C++ /** * Definition for singly-linked list. * struct ListN ...
- oracle 修改表空间名
1.登录使用sys用户登录 sqlplus sys/ as sysdba 2.修改表空间名字 SQL> alter tablespace 旧表空间名 rename to 新表空间名; 表空间已更 ...
- Jenkins MultiJob
前提:项目有十几个服务每次发版/更新服务需要一个个去编译 目的:希望能够建立一个任务一次构建可以批量编译很多服务,并且需要输入一个参数指定编译的分支 需要插件: MultiJob 安装插件 1.在Je ...
- 纯 CSS 自定义多行省略:从原理到实现
文字溢出怎么展示,你的需求是什么?单行还是多行?截断,省略,自定义样式,自适应高度?在这里你都能找到答案.接下来我会由浅入深,从原理到实现,带你一步步揭开多行省略的面纱.我们先从最简单的单行溢出省略开 ...
- 某企业桌面虚拟化项目-Citrix虚拟桌面解决方案
xxx桌面虚拟化项目Citrix解决方案 xxx桌面虚拟化项目 Citrix解决方案 1 项目背景 秉承"尊重个性.创造价值.贡献于社会"的企业理念和开拓创新的精神,xxx所制造. ...
- Jmeter 运行结果的csv文件生成报告
把运行结果保存到本地,下次可以直接用结果生成测试报告. 一.首先保证脚本能正常运行 二.本地创建csv文件,用来保存运行结果 三.察看结果树,选择本地文件(上一步创建好的csv文件),保存运行结果,如 ...
- Linux ns 4. UTS Namespace 详解
目录 1. 使用简介 1.1 hostname 1.2 domainname 1.3 uname 2. 代码分析 2.1 copy_utsname() 2.2 sethostname() 2.3 ge ...
- Typora下载安装教程
Typoa下载和安装 Typora---程序员记事本!!! 这里我们选择Typora作为我们的编辑器,功能的强大需要各位自己去体会. Typora下载地址 点击链接打开,然后选择Download! 根 ...
- A Modified Particle Swarm Optimizer
A Modified Particle Swarm Optimizer 一种改进的粒子群优化算法 Yuhui Shi and Russell Eberhart 1998 摘要: 本文在原有的粒 ...