Spark学习笔记——键值对操作
键值对 RDD是 Spark 中许多操作所需要的常见数据类型
键值对 RDD 通常用来进行聚合计算。我们一般要先通过一些初始 ETL(抽取、转化、装载)操作来将数据转化为键值对形式。
Spark 为包含键值对类型的 RDD 提供了一些专有的操作。
1.创建Pair RDD
val input = sc.parallelize(List(1, 2, 3, 4))
val pairs = input.map(x => (x+1, x))
for (pair <- pairs){
println(pair)
}
//输出
(2,1)
(3,2)
(4,3)
(5,4)
2.Pair RDD的转化操作
Pair RDD 可以使用所有标准 RDD 上的可用的转化操作。



Pair RDD也支持RDD所支持的函数
pairs.filter{case (key, value) => value.length < 20}
3.聚合操作
类似fold() 、 combine() 、 reduce() 等行动操作,这些操作返回 RDD,因此它们是转化操作而不是行动操作。
reduceByKey()函数,接收一个函数,并使用这个函数对值进行合并
val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b) #切分成单词,转换成键值对并计数
或者
input.flatMap(x => x.split(" ")).countByValue()
foldByKey()函数,也是接收一个函数,并使用这个函数对值进行合并,提供初始值
rdd.mapValues(x => (x, 1)).reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2))

countByValue()函数
val textFile = sc.textFile(inputFile)
val result1 = textFile.flatMap(x => x.split(" ")).countByValue()
println(result1)
输出:Map(cc -> 3, aa -> 6, bb -> 3, ee -> 3, ff -> 2, hh -> 1, dd -> 1, gg -> 1)
combineByKey()函数,使用 combineByKey() 求每个键对应的平均值
val data = Seq(("a", 3), ("b", 4), ("a", 1))
val input2 = sc.parallelize(data)
//使用 combineByKey() 求每个键对应的平均值
val result2 = input2.combineByKey(
(v) => (v, 1),
(acc: (Int, Int), v) => (acc._1 + v, acc._2 + 1),
(acc1: (Int, Int), acc2: (Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2)
).map{ case (key, value) => (key, value._1 / value._2.toFloat) }
result2.collectAsMap().map(println(_))
//输出
(b,4.0)
(a,2.0)
4.数据分组
groupByKey()函数,将数据根据键进行分组
val data = Seq(("a", 3), ("b", 4), ("a", 1))
val input2 = sc.parallelize(data)
val result3 = input2.groupByKey()
for (result <- result3)
println(result)
//输出:
(a,CompactBuffer(3, 1))
(b,CompactBuffer(4))
5.连接
join操作符
val input = sc.parallelize(List(1, 2, 3, 4))
val pairs1 = input.map(x => (x+1, x))
//输出(2,1),(3,2),(4,3),(5,4)
val pairs2 = input.map(x => (x+1, 1))
//输出(2,1),(3,1),(4,1),(5,1)
for(pair <- pairs1.join(pairs2)){
println(pair)
}
//输出(4,(3,1)),(3,(2,1)),(5,(4,1)),(2,(1,1))
有时,我们不希望结果中的键必须在两个 RDD 中都存在,join的部分可以不存在
leftOuterJoin(other) 和 rightOuterJoin(other) 都会根据键连接两个 RDD,但是允许结果中存在其中的一个 pair RDD 所 缺失的键。
leftOuterJoin(other)结果
(4,(3,Some(1)))
(3,(2,Some(1)))
(5,(4,Some(1)))
(2,(1,Some(1)))
rightOuterJoin(other)结果
(4,(Some(3),1))
(3,(Some(2),1))
(5,(Some(4),1))
(2,(Some(1),1))
6.数据排序
在 Scala 中以字符串顺序对整数进行自定义排序
val input = sc.parallelize(List(1, 2, 3, 4))
val pairs1 = input.map(x => (x + 1, x))
implicit val sortIntegersByString = new Ordering[Int] {
override def compare(a: Int, b: Int) = b.toString.compare(a.toString)
}
for(pair <- pairs1.sortByKey())
println(pair)
//输出
(5,4)
(4,3)
(3,2)
(2,1)

Spark学习笔记——键值对操作的更多相关文章
- Spark学习之键值对操作总结
键值对 RDD 是 Spark 中许多操作所需要的常见数据类型.键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式.键值对 RDD ...
- Spark学习之键值对(pair RDD)操作(3)
Spark学习之键值对(pair RDD)操作(3) 1. 我们通常从一个RDD中提取某些字段(如代表事件时间.用户ID或者其他标识符的字段),并使用这些字段为pair RDD操作中的键. 2. 创建 ...
- Spark中的键值对操作-scala
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- Spark中的键值对操作
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- Spark学习笔记3:键值对操作
键值对RDD通常用来进行聚合计算,Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为pair RDD.pair RDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口. S ...
- spark入门(三)键值对操作
1 简述 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD. 2 创建PairRDD 2.1 在sprk中,很多存储键值对的数据在读取时直接返回由其键值对数据组成 ...
- Spark基础:(三)Spark 键值对操作
1.pair RDD的简介 Spark为包含键值对类型的RDD提供了一些专有的操作,这些RDD就被称为pair RDD 那么如何创建pair RDD呢? 在不同的语言中有着不同的创建方式 在pytho ...
- Spark学习笔记之SparkRDD
Spark学习笔记之SparkRDD 一. 基本概念 RDD(resilient distributed datasets)弹性分布式数据集. 来自于两方面 ① 内存集合和外部存储系统 ② ...
- Spark学习笔记3——RDD(下)
目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ...
随机推荐
- Python3基础之字典
Python数据类型之字典(Dictionary) 字典特征 特征 可变.无序.映射.键值对 形式 {key0:value0, key1:value1, key2:value3, ..., } key ...
- oracle中查找和删除重复记录的几种方法总结
平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录. 下面总结一下几种查找和删除重复记录的方法(以表CZ为例): 表CZ的结 ...
- 机器学习笔记(2):线性回归-使用gluon
代码来自:https://zh.gluon.ai/chapter_supervised-learning/linear-regression-gluon.html from mxnet import ...
- C#--WinForm项目主窗体设计
主窗体基本设置 大小.颜色.去边框.出现的位置 Panel控件 背景图.颜色.布局: Label标签 文本.字体.背景颜色.布局 按钮 布局.文本.字体颜色.背景色. 底部panel绑定控件边框.颜色 ...
- 四种常见 Git 工作流比较
BY 童仲毅(geeeeeeeeek@github) 这是一篇在原文(BY atlassian)基础上演绎的译文.除非另行注明,页面上所有内容采用知识共享-署名(CC BY 2.5 AU)协议共享. ...
- linux设置预留端口号,防止监听端口被占用 ip_local_reserved_ports
1. 背景 linux服务器启动时,会对指定的端口进行监听bind,如果同一个机器上这个端口已经被使用,则监听失败,程序无法启动. linux客户端连接服务器accept时,系统会分配本地临时端口用于 ...
- 使用GPStracker自建卫星定位跟踪平台
经常有人问,我能不能手机定位跟踪谁谁谁,我能不能定位跟踪我的车,等等问题. 话说不难,确实,需要客户端和服务端结合起来就能实现. 今天就给大家介绍一下GPStracker,一套开源的定位跟踪系统,有手 ...
- 【T04】开发并使用应用程序框架
1.TCP/IP应用程序分为 TCP服务器 TCP客户端 UDP服务器 UDP客户端 2.构建框架库是比较简单的一件事,主要就是对socket编程.
- oracle decode()函数的参数原来可以为sql语句!
1.情景展示 判断某个字段的值,如果以APP开头,需查询APP表里对应的数据:如果是以JG开头,就查询机构对应的表. 2.原因分析 如果使用CASE WHEN THEN或者IF ELSIF 太麻烦 ...
- 【SqlServer】SqlServer的异常处理
在SQLserver数据库中,如果有很多存储过程的时候,我们会使用动态SQL进行存储过程调用存储过程,这时候,很可能在某个环节就出错了,但是出错了我们很难去跟踪到出错的存储过程,此时我们就可以使用异常 ...