spark计算操作整理

spark 的计算流程大概如图:

image-20210320195749142

其中, 通过多次处理, 生成多个中间数据, 最后对结果进行操作获得数据. 本文不涉及任何原理, 仅总结spark在处理的时候支持的所有操作, 方便后面使用的时候, 可以参照本文进行数据的处理.

以下函数整理, 基与PythonRDD对象.

数据的转换操作

数据之间的转换操作, 用于生成中间数据.

方法名说明
过滤
filter过滤掉函数计算后返回 false 的数据
distinct对数据集中的元素进行去重.
数据转换
map一对一. 方法用于对数据进行转换, 一个输入转换为一个输出
flatMap一对多. 方法对数据进行转换, 一个输入转换为0或多个输出, 所以回调返回一个序列
mapPartitions多对多. 数据转换批量. 方法对数据进行转换, 每次接收一个任务分区的数据集合进行处理, 同时返回一个转换后的数据序列. 作用类似map, 只是可以批量处理, 对优化性能有一定的帮助.
mapPartitionsWithIndexmapPartitions方法类似, 不同的是此函数回调额外接收分区的序号.
flatMapValues一对多. 针对(K, V)数据集, 将一个 V 拆分为多个.
mapValues一对一. 针对(K, V)数据集. 将每个 value 进行转换
keyBy将数据集转成(K, V), 为每个元素通过自定义函数生成一个 K
zipWithIndex将数据转为(K, V)数据集. K 是元素, V 是索引
keys针对 (K, V)数据集, 取所有的 key
values针对(K, V)数据集, 取所有的 value
相同 key 合并(K, V)数据
reduceByKey多个 V 转换为一个, 类型不变.
将相同 key 的 value 通过自定义函数合成, 返回一个新的 (K, V) 数据集, 此时所有的相同 key 已经合并在一起了.
foldByKey多个 V 转换为一个, 类型不变, 可设初始值
将相同 key 的 value, 通过自定义函数合并为一个. 与reduceByKey的区别是, 此函数可以设置一个初始值
aggregateByKey多个 V 转换为一个, 类型可变, 可设初始值.
针对(K, V)数据集, 将相同 key 的元素聚合为一个. 合并前后的数据类型可以不一样. 其接收三个参数:
zeroValue: 自定义信息的初始状态
seqOp: 对元素分区中的每个元素进行处理. 参数为: 每次方法的返回(初始为: zeroValue), 本次元素
combOp: 对每个分区的结果进行合并. 参数为: 每次方法的返回(初始为: zeroValue), 本次元素(seqOp 返回)
combineByKey多个 V 组合为一个, 类型改变.
针对(K, V)数据集, 将相同 key 元素进行聚合. 转换为一个 (K, C)的数据集. 其接收回调来生成 C 类型
createCombiner: 将类型 V 转为类型 C.
mergeValue: 将 V 和 C 进行合并.
mergeCombiners: 将两个 C 进行合并
分组
groupBy自定义函数进行分组. 函数对每个元素进行计算, 结果相同的值被分到一组, 返回 (K, V[])
groupByKey根据数据的 key 进行编组. 在一个 (K, V) 的数据集上, 返回 (K, V[]) 的结果.
排序
sortBy根据自定义函数进行排序
sortByKey针对(K, V) 数据集, 根据 key 进行排序, 可自定义排序函数
此函数通过sortBy也可以实现相同功能, 不过对于 (K, V), 此函数方便一些
随机采样
sample方法对数据集进行随机采样, 其接收参数:
1. 是否可重复
2. 每个元素被选中的期望次数(0-1)
3. 随机数种子
sampleByKey针对(K, V)数据集, 可指定多个 K 的每个随机频率, 按照频率返回指定 K 的取样数据
randomSplit将一个 rdd 随机分为多个 rdd
数据合并
union将两个数据集合并为一个数据集, 用于后续处理.
cartesian对两个数据集做笛卡尔积. 比如:
数据1内容: [1, 2]
数据2内容: [3, 4]
结果内容: (1, 3), (1, 4), (2, 3), (2, 4)
join针对 (K, V) 数据集之间的合并. 两个数据集: (K, V1), (K, V2). 合并后的数据集: (K, (V1, V2))
cogroup, groupWith针对 (K, V)数据集的合并. 两个函数作用相同
数据集1内容: (K1, V1), (K2, V2), (K1, V3)
数据集2内容: (K1, V4)
合并后的内容: (K1, ([V1, V3], [V4] ) ), (K2, ([V2], []) )
fullOuterJoin针对(K, V)数据集. 返回合并后的元素序列, 若其中一个数据集没有, 用 None 占位
数据集1内容: (K1, V1)
数据集2内容: (K1, V2), (K2, V3)
结果: (K1, (V1, V2)), (K2, (None, V3))
leftOuterJoin针对(K, V)数据集, 执行左侧外连接. 与fullOuterJoin 的区别是, 若 K 在第一个数据集不存在, 则不返回
rightOuterJoin针对 (K, V)数据集, 执行右侧外链接
intersection取两个数据集的交集
subtract取数据集的差集, 元素在数据1中, 不在数据2中.
subtractByKey取数据差集, 针对 (K, V)数据. K 在数据1中, 不再数据2中
zip将两个数据集合并为(K, V)数据集, 两数据集元素数量必须一致
分区操作
coalesce将 RDD 缩减到 n 个分区, 可指定是否乱序
repartition将 RDD 修改到 n 个分区, 乱序
repartitionAndSortWithinPartitions将 RDD 修改为 n 个分区, 并在每个分区根据 key 进行排序. 可自定义分区函数与排序函数
glom将每个分区的元素合并为一个列表

结果的获取操作

用于从已经处理过的数据集中取出结果.

方法名说明
数据合并
reduce通过自定义函数, 将数据集中所有元素合并为一个元素返回.
fold将所有元素合并为一个. 与reduce的区别是, 这个函数有个初始值
aggregate将所有元素合并为一个元素. 在合并过程中可以携带自定义信息. 合并前后的数据类型可以不一样. 参数见: aggregateByKey
获取结果
collect将结果中的数据作为数组返回. 通过通过前面处理后, 只剩下很小的数据才会这么做.
collectAsMap针对(K, V)数据集. 将其作为 map 返回
first获取结果中的第一个元素.
take获取结果的前 n 个元素.
takeSample返回结果的 n 个元素, 采样获取.
takeOrdered获取结果的前 n 个元素, 会先根据自定义函数对结果进行排序. 内存排序
froeach遍历结果
foreachPartition遍历结果分区, 每次接收一批数据
lookup针对(K, V)数据集. 找到所有指定 K 的元素返回
统计结果
count获取结果元素个数.
countByValue统计结果中每一个元素的个数. 返回结果如: (V, 2)
countByKey对(K, V)数据集. 统计每一个 key 的数量, 返回结果如: (K, 2)
countApproxDistinct统计数据集中去重的元素个数, 根据精度不同, 其准确度不一定, 此方法返回的是一个大致的值.
max结果中的最大值, 可自定义比较函数
min结果的最小值. 可自定义比较函数
sum求和
mean结果的平均值
stdev元素的标准差
variance计算方差
sampleStdev结果元素的样本标准差 (除以 n-1那个)
sampleVariance计算元素的样本方差 (除以 n-1那个)
保存结果
saveAsTextFile将结果输出到指定文件. 对结果中的每个元素调用 toString 方法, 保存为一行数据.
等等吧, 都是 saveAs 打头的方法

比如Spark SQL等还有一些自己实现的方法来方便使用的, 没有在此列出. 留着后面写的时候作为参考, 毕竟英语是硬伤.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程模型

你在工作中, 软件的开发流程是怎样的? 你是否想过, 除了你当前使用的流程, 还存在其他怎样的流程? 现在的流程有哪些问题, 又能够如何解决? 别说, 前辈们已经给出了一些项目流程的模型, 既软件工程. 可以简单了解一下, 带动一下我这生了锈的脑子. 在很久以前, 一个软件的从…

路径.git下的文件

用了这么久的git, 可以毫不谦虚地说对git是一无所知. 每天用来用去的就是commit, add, merge 等几个有限的命令, 这不符合我这刨根问底的性格啊. 不行, 得研究研究, 从哪里下手呢? 别的咱先不说, 所有 git 项目都有这么一个文件夹.git, 不如就从它入手 ? 那咱就看看这个文件夹…

git 操作二进制文件

平常用git进行项目管理已经稀松平常了, 今天咱来点不一样的. 平常管理的都是普通的文本文件, 如果是二进制文件, git能够处理么? 比如word文档. 测试一下. 新建一个项目, 在其中创建test1.docx, test2.txt两个空文件并提交. 之后编辑文件并添加标题, git diff看一下效果: 效…

搭建个人博客

一直都想着搞一个自己的个人博客, 拖着这么久, 最近终于开始动手了. 故留下一篇完整的记录, 若你也刚好有相同的需要, 那这篇文章应该恰好能够帮助到你. 准备 云服务器个人域名 如果没有云服务器, 将应用跑在自己的电脑上, 通过内网穿透大概也能达到效果, 但是个人电脑实在没…

nginx 配置文件的匹配规则

引出 之前在对php-fpm 进行nginx代理时, 为了对后台限定 IP 访问, 添加了如下配置: location ^~ /admin {allow 127.0.0.1;deny all; }结果呢? 所有admin路径下的php文件, 全都没有解析, 变成文件下载了. 当时我不知道是什么问题, 不过将这段配置去掉之后, 问题就消失了. 所…

计算机是如何进行时间同步的

WHY 在网络世界中, 各个计算机之间要想协同工作, 时间同步是一个十分重要的基础. 在计算机内部是有自己的时间的, 这个时间通过内部的晶体振荡器差生的固定频率, 来模拟时间流逝进行计算. 虽然频率十分稳定, 但也是有误差的, 虽然现在的工艺水平误差已经十分小了. (关于震荡的…

WordPress架构简单剖析

前言 最近在搭建自己的博客站点时, 选择了网站使用较多的WordPress, 随着慢慢的使用, 它灵活的插件和主题令我折服. 基本上任何想要实现的功能, 都可以在上面通过插件的形式进行添加. 无论是在访问前的缓存、访问后的统计、访问中的过滤、各种流程的修改等等, 几乎都能够以插件…

阿里云定时任务并自动释放

前言 最近写了一个爬虫脚本, 脚本跑在一台北京的 ecs 上. 但奈何因某种未知力量, 需要连接代理才能访问目标网站. 本来想着自己搭代理, 但是太贵了, 就暂时搁置了. 直到我发现了这个: 阿里云香港的服务器, 一个小时才5分钱. 如果脚本直接跑在香港服务器上不就可以了咩, 按照这…

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金豺算法4.实验参数设定5.算法结果6.参考文献7.MA…

PHP-PDO参数绑定问题

前言 今天在执行这样一段代码: $data [username > hujingnb,address > beijing, ]; $dbh new PDO("mysql:host{$host};dbname{$dbname}", $username, $password); $statement $dbh->prepare(INSERT INTO test_user (username, address) VALUES (:usern…

Python 的协程

前言 最近在看部分Python源码时, 发现了async 这个关键字. 查了一下发现了Python中的协程. 协程这玩意, 在GO中我用过啊, 简单说, 就是一个轻量级的线程嘛, 由语言自己来实现不同协程的调度. 想着Python中可能也是差不多的东西吧. 但是我Google搜了一下, 前面的说明都给出了下…

虚拟内存分页机制的地址映射

概述 在之前的文章虚拟内存对分页机制做了简单的介绍. 还有一个疑问, 那就是如何将虚存中的逻辑地址映射为物理地址呢? 今天就来简单分析一下. 对于一个分页的地址来说, 一般包含两个元素: 页号: 第几页偏移量: 当前页的第几个字节 以下以 addr_virtual(p, o)表示一个逻辑…

虚拟内存分页机制的页面置换

前言 之前简单介绍过虚拟内存是如何与物理内存进行地址映射的: 虚拟内存分页机制的地址映射, 但是仅仅地址映射是不够的, 在地址映射说过会有缺页的情况, 此时就需要操作操作系统将缺少的页加载到内存中. 但是, 如果内存满了怎么办呢? 毕竟虚拟内存一般都要大于物理内存的, 不…

Kubernetes各个组件的概念

前言 Kubernetes中的概念太多了, 什么Pod Service Deployment 等等等等, 给刚接触的我都整蒙了. 通过几天观察下来, 说一下我对各个组件的理解. 此文章仅仅对这些概念做一个简单的介绍, 不至于后面看其他文章的时候一头雾水. Node Node很好理解. 就是服务实际运行的实例, 可…

Kubernetes中Pod生命周期

在 Kubernetes中Pod是容器管理的最小单位, 有着各种各样的Pod管理器. 那么一个Pod从启动到释放, 在这期间经历了哪些过程呢? Pod自开始创建, 到正常运行, 再到释放, 其时间跨度及经历的阶段大致如下: 说一下各个阶段的作用以及是为了解决什么问题. 容器调度和下载镜像的过程就…

wait函数的作用

前言 在编写C程序的时候, 通过fork函数来创建新的进程, wait函数来等待子进程结束. 那么就有一个问题了, 什么情况下父进程需要等待子进程结束后继续执行呢? 如果需要等待子进程结束, 那直接将操作放到父进程执行不就醒了么? 反正等着也是等着. 当然, 还有有一种情况, 任务…

OAuth1.0介绍

背景 为什么需要OAuth授权呢? 最典型的应用场景就是第三方登录了, 我们开发了一个网站希望用户可以QQ登录, 但是怎么能拿到用户的 QQ 信息呢? 用户将 账号密码告诉我们当然可以, 但是这样有如下隐患: 我们拿到了用户的密码, 这样很不安全. 而且任意一个应用被黑, 所有相关…

PHP 数组的内部实现

前言 这几天在翻github的时候, 碰巧看到了php的源码, 就 down 下来随便翻了翻. 地址: https://github.com/php/php-src 那么PHP中什么玩意最引人注目嘞? 一定是数组了, PHP中的数组太强大了, 于是就想着不如进去看看数组的实现部分. 这篇文章打算全程针对代码进行解读了. 以…

base64编码原理

引出 众所周知, ASICC编码共127个, 使用了7个bit进行编码. 而文件在存储的时候是以 字节为单位, 也就是8bit. 这就难免导致有一部分编码是没有定义在ASICC编码中的. 而在网络中传输二进制数据的时候(字符串本质上也是二进制数据嘛), 如果直接传输比特流, 倒也不是不可以, 只是…

页面加载速度-合并资源文件

前言 一直觉得自己的博客站点页面加载很慢, 就想着去优化一下. 呐, 下图是一次文章页面的加载, 需要2.5s. 其中 js 文件就有18个. 众所周知, 浏览器对资源文件的并行下载数量是有限制的(不同浏览器限制不同). 也就是说, 这18个 js 文件是无法同时下载的, 再说了, 页面中还有其…