Spark学习摘记 —— Pair RDD行动操作API归纳
本文参考
参考《Spark快速大数据分析》动物书中的第四章"键值对操作",本篇是对RDD转化操作和行动操作API归纳的最后一篇
RDD转化操作API归纳:https://www.cnblogs.com/kuluo/p/12545374.html
RDD行动操作API归纳:https://www.cnblogs.com/kuluo/p/12550938.html
pair RDD转化操作API归纳:https://www.cnblogs.com/kuluo/p/12558563.html
环境
idea + spark 2.4.5 + scala 2.11.12
RDD均通过SparkContext的parallelize()函数创建
countByKey()函数
目的:
对每个键对应的元素分别计数
代码:
/*
* (a,3) (b,5) (c,4) (d,2)
*/
val testList1 = List("a a a b b b", "b b c c c", "c d d")
/*
* (a,5) (b,4)
*/
val testList2 = List("a a a a a b b", "b b")
val testRdd1 = sc.parallelize(testList1)
val testRdd2 = sc.parallelize(testList2)
val map = testRdd1.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
.union(testRdd2.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _))
.countByKey()
for ((x, y) <- map) {
println(s"($x, $y)")
}
输出:
(d, 1)
(a, 2)
(b, 2)
(c, 1)
注意:
This method should only be used if the resulting map is expected to be small, as the whole thing is loaded into the driver's memory. To handle very large results, consider using rdd.mapValues(_ => 1L).reduceByKey(_ + _), which returns an RDD[T, Long] instead of a map.
countByKey()函数会将结果全部加载到驱动器进程中,不适合结果集较大时使用
我们在源码中可以看到它调用了collect()函数
def countByKey(): Map[K, Long] = self.withScope { self.mapValues(_ => 1L).reduceByKey(_ + _).collect().toMap }
因此在处理大数据量时,应当使用.mapValues(_ => 1L).reduceByKey(_ + _)两个函数返回一个RDD
collectAsMap()函数
目的:
collect()函数针对pair RDD的实现,将结果以映射表的形式返回
代码:
/*
* (a,3) (b,5) (c,4) (d,2)
*/
val testList1 = List("a a a b b b", "b b c c c", "c d d")
/*
* (a,5) (b,4)
*/
val testList2 = List("a a a a a b b", "b b")
val testRdd1 = sc.parallelize(testList1)
val testRdd2 = sc.parallelize(testList2)
val map = testRdd1.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
.union(testRdd2.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _))
.collectAsMap()
for ((x, y) <- map) {
println(s"($x, $y)")
}
输出:
(b, 4)
(d, 2)
(a, 5)
(c, 4)
注意:
this doesn't return a multimap (so if you have multiple values to the same key, only one value per key is preserved in the map returned)
也正如本例所示,pair RDD中有重复的键时,collectByKey函数只会保留一个
因为内部调用了collect()函数,不适合结果集较大时使用
lookup()函数
目的:
返回给定键对应的所有值
代码:
/*
* (a,3) (b,5) (c,4) (d,2)
*/
val testList1 = List("a a a b b b", "b b c c c", "c d d")
/*
* (a,5) (b,4)
*/
val testList2 = List("a a a a a b b", "b b")
val testRdd1 = sc.parallelize(testList1)
val testRdd2 = sc.parallelize(testList2)
println(testRdd1.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
.union(testRdd2.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _))
.lookup("a"))
输出:
ArrayBuffer(3, 5)
Spark学习摘记 —— Pair RDD行动操作API归纳的更多相关文章
- Spark学习摘记 —— Pair RDD转化操作API归纳
本文参考 参考<Spark快速大数据分析>动物书中的第四章"键值对操作",由于pair RDD的一些特殊操作,没有和前面两篇的API归纳放在一起做示例 前面的几个api ...
- Spark学习摘记 —— RDD行动操作API归纳
本文参考 参考<Spark快速大数据分析>动物书中的第三章"RDD编程",前一篇文章已经概述了转化操作相关的API,本文再介绍行动操作API 和转化操作API不同的是, ...
- Spark学习摘记 —— RDD转化操作API归纳
本文参考 在阅读了<Spark快速大数据分析>动物书后,大概了解到了spark常用的api,不过书中并没有给予所有api具体的示例,而且现在spark的最新版本已经上升到了2.4.5,动物 ...
- Spark学习之键值对(pair RDD)操作(3)
Spark学习之键值对(pair RDD)操作(3) 1. 我们通常从一个RDD中提取某些字段(如代表事件时间.用户ID或者其他标识符的字段),并使用这些字段为pair RDD操作中的键. 2. 创建 ...
- Spark学习笔记3——RDD(下)
目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ...
- Spark学习笔记2——RDD(上)
目录 Spark学习笔记2--RDD(上) RDD是什么? 例子 创建 RDD 并行化方式 读取外部数据集方式 RDD 操作 转化操作 行动操作 惰性求值 Spark学习笔记2--RDD(上) 笔记摘 ...
- spark中的pair rdd,看这一篇就够了
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是spark专题的第四篇文章,我们一起来看下Pair RDD. 定义 在之前的文章当中,我们已经熟悉了RDD的相关概念,也了解了RDD基 ...
- spark Pair RDD 基础操作
下面是Pair RDD的API讲解 转化操作 reduceByKey:合并具有相同键的值: groupByKey:对具有相同键的值进行分组: keys:返回一个仅包含键值的RDD: values:返回 ...
- Spark学习笔记之RDD中的Transformation和Action函数
总算可以开始写第一篇技术博客了,就从学习Spark开始吧.之前阅读了很多关于Spark的文章,对Spark的工作机制及编程模型有了一定了解,下面把Spark中对RDD的常用操作函数做一下总结,以pys ...
随机推荐
- VisualStudio2019 利用代码片段管理器新建快捷命令
原文:https://www.cnblogs.com/huguodong/p/12694902.html 一.前言 VisualStudio 可以通过敲出缩写字符串,然后按两次Tab按键自动展开成一段 ...
- 5个相见恨晚的Linux命令,每一个都非常实用
转至:https://zhuanlan.zhihu.com/p/57866239 作为一个开发人员,经常要用到终端命令,最让人头疼的是记不住繁琐的参数.用谷哥度娘检索效率低下,通过man命令显示的结果 ...
- spring 核心容器api
spring api : https://docs.spring.io/spring-framework/docs/current/javadoc-api/ BeanFactory 才是 Spring ...
- Qt:Qt资源系统
学习自 Qt 资源系统(Qt Resource System) - 知乎 1.什么是Qt 资源系统 Qt资源系统是一种将图片.数据存储于二进制文件中的一套系统.这些图片.数据会被我们的程序使用,它们称 ...
- vue如何全局引用公共js
在项目开发中需要调用一些工具类方法,所以需要将公共方法放在公共js中,并且需要全局引用这些公共js 1:创建公共JS(utils.js) src/common/utils.js export def ...
- Jmeter混合场景压力测试
性能测试设计混合场景,一般有几种方式 分别是:1:每个场景设置一个线程组:2:使用if控制器:3:使用吞吐量控制器. 不同的方式实现机制不一样,个人觉得"使用吞吐量控制器"比较方便 ...
- JS 实现排序算法
冒泡排序 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了 ...
- C/C++语言读取SEGY文件笔记(一)
SEGY IO 推荐采用的IDE为Visual studio(VS),本文档将介绍SEGY文件的读取与写入过程,即SEGY文件的复制. 因此,新建头文件ReadSeismic.h与C++文件ReadS ...
- Mock平台3-初识Antd React 开箱即用中台前端框架
微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 内容提要 首先说下为啥这次测试开发系列教程前端选择Antd React,其实也是纠结对比过最终决定挑战一把,想法大概有几下几点: 笔者自己 ...
- java-Dos
打开CMD的方式 1.菜单打开 2.Windows+R 输入cmd 3.shift+鼠标右键 选择在此处打开命令行窗口 4.资源管理器地址栏前+cmd 空格 管理员身份运行 常用的Dos命令 #盘符切 ...