[spark]transformation算子

news/2024/5/4 10:57:01/文章来源:https://blog.csdn.net/qq_35896718/article/details/127525635

1.sample算子

1)说明

sample算子:对rdd中的数据进行抽样。一个非常重要的作用就是开看rdd中数据的分布,进行各种调优与优化。

数据倾斜:数据分布的不均匀,shuffle会将相同key的数据汇总到一台机器上,就会导致某些task执行的特别慢。

找到哪些发生数据倾斜的key:sample算子+reduceByKey就可以知道哪一个key出现次数最多,出现次数最多的key往往就是发生数据倾斜的key,找到这个key后就可以进行数据倾斜优化。

如果用reduceByKey显然能统计出key的次数,但是该方法本很还是会造成数据倾斜,所以不采用这种方式。

2)用法

参数 :

withReplacement:是否可替换,确定抽样方法。true为可放回抽同样,false为不可放回抽样。fraction(小数):确定抽样比例,范围(0,1)

seed:种子数

 2.map、mapPartition、mapPartitionWithIndex

1)map(f:T=>U)

对rdd中每个元素调用一次f函数,效率低。该函数是有一个参数,有一个返回值的函数。

输出: 

 说明:map和foreach都是窄依赖,所以task是并行执行的,分区是按照Range进行分区的,并且有的task执行的快,有的task执行的慢,所以输出顺序不确定。

2)mapPartitions(f:Iterator[T]=>Iterator[U])

该函数是对该rdd被分成的每一个partition调用一次f函数,效率比map高。

迭代器:可遍历的东西就是迭代器,比如集合。

输出:3 5 7 2 8 6 4

说明: partition=>parititon.map(_*7)是参数和返回值都是迭代器的函数

3)mapPartitionsWithIndex(f:(Int,Iterator[T])=>Iterator[U])

该函数也是对该rdd被分成的每一个partition调用一次f函数,该函数的参数是:(index,迭代器)即分区号和迭代器,返回值是迭代器。该算子和mapPartition的区别是:多了一个index,该index代表的就是当前被操作的paritition的编号,一个rdd被分为多个partition,每个partition都有一个编号,编号从0开始,假如有N个分区,编号的取值范围就是[0,N-1],通过该index可以清楚的看到每一个分区中数据的分布。

输出

说明:

mapPartitionsWithIndex算子和foreach算子都是窄依赖,即task是并行执行的。

分区是按照Range进行分区的,有的task执行的快有的task执行的慢,所以每次输出顺序不一样。

3.union(窄依赖)

union(other:RDD[T]):RDD[T]

hive中:union去重且排序,union all不去重不排序

spark的union相当于hive的union all

union只是将两个rdd的分区进行了拼接,它是一个窄依赖

4.distinct(宽依赖)

 作用:将所有分区内的元素收集到一块进行去重,再将去重后的数据进行分区,参数指的是分多少个分区。

输出

[0]List(1, 3, 7, 9, 5)

5.intersection(宽依赖)

 

6.groupByKey(宽依赖)、groupBy(宽依赖)

1)groupByKey(numPartitions:Int):RDD[K,Iterable[V]]

作用:按照key将数据进行分组,groupByKey操作的RDD的数据类型是k-v类型的。

参数numPartitions:指结果RDD的分区个数,也可以不写参数,默认是和父RDD一样的分区数,返回值是一个元组,第一个值是key的值,第二个值是该key进行分组的value组成的迭代器。

reduceByKey是有本地预聚合操作的,而这个groupByKey是没有本地预聚合操作的。所以不能groupByKey就不要用它,可以用reduceByKey或aggregateByKey替代。

2)groupBy(f:T=>K):RDD[(K,Iterable[T])]

内部调用的是groupByKey,最好用reduceByKey或aggregateByKey代替。

和groupByKey不同的是它操作的不是k-v类型,它的参数是一个函数f,这个函数的返回值K会作为分组的key,value是f函数中的参数T,groupBy按照这个key进行分组。groupBy的返回值和groupByKey一毛一样。

输出:

河北:List(1,小红)

北京:List(2,小明)

黑龙江:List(3,小灰, 4,小微)

输出:
黑龙江:List(3,小灰,黑龙江, 4,小微,黑龙江)

北京:List(2,小明,北京)

河北:List(1,小红,河北)

7.join(两个rdd的分区相同时是窄依赖,不同时是宽依赖)

join操作的必须是k-v类型的RDD

1)across join交叉连接(笛卡尔积)

2)内连接

参数是一个k-v格式的RDD,返回值也是一个元组,元组的第一个值是key,第二个值是两个集合的value组成的元组。

 A join B on A.id=B.id

join也可以写成inner join。获取A和B中能够关联上的数据。得到的结果一定是一定的。

3)外连接

外连接的输出数据中一张表中的数据是不确定的,可能有,可能没有。

可能有可能没有的数据类型为Option,Option只有两个值Some(有),None(没有)

a)leftOuterJoin左外连接

左表数据原样输出,右表关联上的显示,关联不上的显示null。 

b)rightOuterJoin右外连接

右外连接,右表数据原样输出,左边关联上的显示,关联不上的显示为null。

c)fullOuterJoin全外连接

分别以两张表为基准表,关联上的显示,关联不上的显示为null。

4)半连接(spark不支持半连接,但Hive支持半连接)

5)例子

输出: 

  

8.cogroup

1)

rdd1.groupByKey:将rdd1按照它的key进行分组,返回key,value组成的元组。其中value是个迭代器,是相同key对应的值组成的迭代器。

2)

 cogroup这个单词的意思:在两个或多个关系中的分组

作用:就是对两个K-V键值对分别执行groupByKey操作,cogroup产生的结果都在一个分区中。

rdd1.cogroup(rdd2):将rdd1和rdd2按照他们相同的key进行分组,返回key,rdd1的value,rdd2的value组成的元组,在这个元组中._1是key,._2是(value1,value2),其中rdd1的value,rdd2的value都是迭代器,是相同key对应的值组成的迭代器。

 9.reudceByKey(宽依赖)

 

 reduceByKey:相当于先将数据进行分组(groupByKey)操作,然后再对每一个组执行reduce操作,进行聚合。

注:reduceByKey是一个transformation算子,reduce是一个action算子。

10.重分区:coelesce、repartition

coalesce:使合并

注:让分区变少是不走shuffle的,让分区变多是走shuffle的。

a)coalesce(numPartition,shuffle=false)

即不走shuffle,只能合并分区,它仅仅是将rdd的分区进行简单的合并,不走shuffle。将原先的N个分区进行合并,合并之后的分区个数为numPartition指定的个数,在这种情况下,如果numPartition的个数大于原本RDD中的分区数,coalesce是不会进行任何处理的。

b)coalesce(numPartition,shuffle=true)

走shuffle,可以增大分区,新的rdd的每个分区需要上一个rdd的所有分区的数据,因此走shuffle。

也可以用repartition(numPartition)来替代coalesce(numPartition,shuffle=true)

因为

重分区在特定情况下是非常必要的,比如在etl清洗过程中,有可能过滤掉很多的脏数据,假如原先100个分区,etl之后减少了30%的数据,此时原先分区中的数据不饱和,一个分区如果对应一个集群上的block,则是128MB,此时一个块不够128M,浪费了资源,这时就可以进行重分区,减少分区个数。

 输出

11.combineByKey、aggregateByKey

1)combineByKey

combine:结合,combiner集合器

combineByKey是spark中的底层聚合操作:

reudceByKey的底层:combineByKeyWithClassTag

groupByKey的底层:combineByKeyWithClassTag

aggregateByKey的:combineByKeyWithClassTag

而combineByKey是combineByKeyWithClassTag的缩写

combineByKey的作用:为聚合提供一些优化手段,实现自定义的聚合操作。

 

注:

C是聚合之后值的数据类型

createCombiner、mergeValue、mergeCombiners是调用combineByKey要传入的3个函数。

其中createCombiner、mergeValue是对同一个分区进行处理,mergeCombiners是对多个分区进行处理。

a)combineByKey模拟groupByKey

这种模拟只是功能上的模拟,groupByKey没有本地预聚合操作,但是combineByKey模拟出来的groupByKey是有本地聚合操作的。

 

b)combineByKey模拟reduceByKey

 

 

2)aggregateByKey

aggregateByKey简化了combineByKey的第一步,aggregateByKey直接提供了初始值。

a)aggregateByKey模拟groupByKey

 

b)aggregateByKey模拟reduceByKey 

12.mapValues

 将键值对的每一个value都应用一个函数,但是key不会发生变化。

 输出

 

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

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

相关文章

水库水雨情监测系统 水雨情自动测控平台 水库雨水情监测及视频监控解决方案_设备_水位_远程

平升电子水库水雨情监测系统 水雨情自动测控平台 水库雨水情监测及视频监控解决方案_设备_水位_远程辅助水利管理部门实现水库雨水情信息“全要素、全量程、全覆盖”自动测报。系统具备水库水位、雨量、现场图像/视频等水文信息采集、传输、处理及预警广播等功能,有…

12-敏感的资料怎么存在K8S-Secret

12-敏感的资料怎么存在K8S-Secret 前言 今天的学习笔记将介绍Kubernetes另一个组件secret。secret协助开发者将一些敏感信息,像是数据库账密、访问其它server的access token、ssh key,用非明文的方式(opaque)存放在Kubernetes中…

【数据结构与算法分析】0基础带你学数据结构与算法分析06--树(TREE)

目录 前言 树的属性 树的实现 树的遍历与应用 深度有限遍历 (DFS) 广度优先遍历 (BFS) Not all roots are buried down in the ground, some are at the top of a tree. — Jinvirle 前言 Tree 是一些结点的集合,这个集合可以是空集;若不是空集…

中国锚杆行业竞争格局及投资风险分析报告

锚杆的概念 锚杆(又称土锚杆、土钉)是在天然土层侧壁钻孔,放置拉杆,注浆锚固而成。根据所用材料,拉杆可分为粗钢筋、高强度钢丝束、钢绞线等。通过计算确定了侧墙上锚杆的截面积、层数、间距和长度。钻孔直径应由设计确定。常用的孔道灌浆有水…

【QT + OsgEarth】(四)加载国界线矢量图

效果图 实现过程 获取国界线矢量图在.earth文件中加载矢量图文件在Qt程序中获取图层节点并控制参数 加载矢量图文件 < image > 标签定义要栅格化的shp文件 driver&#xff1a;使用agglite&#xff0c;将矢量文件栅格成为栅格文件< features > 子标签读取shp文件…

亿可控_第3章 指标数据持久化与设备详情展示

亿可控_第3章 指标数据持久化与设备详情展示 文章目录亿可控_第3章 指标数据持久化与设备详情展示第3章 指标数据持久化与设备详情展示学习目标1. InfluxDB入门及介绍1.1 InfluxDB简介1.2 InfluxDB相关概念1.3 InfluxDB的基本操作1.3.1 InfluxDB数据库操作1.3.2 InfluxDB数据表…

SANGFOR深信服短信插件

设置说明 第一步&#xff1a;先配置短信通知服务器&#xff08;以下以HTTP为例&#xff09;。 步骤1、设置短信通知服务器&#xff0c;在[系统管理/系统配置/高级配置/通知设置]&#xff0c;点击<新增短信通知服务器>&#xff0c;勾选启用&#xff0c;可启用短信通知服…

mdio bcm5482访问

查看硬件原理图&#xff0c;5482通过mdio访问自己的寄存器&#xff0c;M4通过cpld对5482进行初始化操作(复位/解复位&#xff09; 可以看到bcm5482的MDC和MDIO用的是port P 的pin4和pin5,所以基地址为GPIO_PORTP_BASE. 对应的分别是引脚4和引脚5&#xff0c;所以由此可以封装出…

SHEIN算法工程师面试题7道|含解析

8本电子书免费送给大家&#xff0c;见文末。 1、数据处理的常用方法有哪些&#xff1f; 对于离群点 当作缺失值进行处理删掉离群点所在的样本实用统计值进行填充 对于缺失值 可以用均值或均位数进行填充可以用特定值&#xff0c;如-1可以用np.nan表示 对于类别特征 编码方…

SPI示例学习

Service Provider Interface 它是从Java 6开始引入的&#xff0c;是一种基于ClassLoader来发现并加载服务的机制。 服务发现机制&#xff1a;通过在ClassPath路径下的META-INFO/services文件夹中查找文件&#xff0c;并自动加载文件里所定义的类。 SPI机制可以很好的解决不同…

到了2023年,PMP项目管理师证书含金量会如何?考试难度大么?

先介绍一下PMP PMP考试是由PMI(美国项目管理协会Project Management Institute)组织和出题,严格评估项目管理人员知识技能是否具有高品质的资格认证考试。1999年&#xff0c;PMP考试在所有认证考试中第一个获得ISO9001国际质量认证,从而成为全球最权威的认证考试之一。 pmp考…

Oracle技术分享 数据库序列间断场景

文档课题&#xff1a;模拟数据库序列间断场景. 1、概念 Gaps insequence values can occur when: a、Arollback occurs 应用出现回滚&#xff0c;但序列不会回滚 b、Thesystem crashes c、Asequence is used in another table 2、实际操作2.1、系统crash SQL>selec…

云原生时代下 K8s CGroup/CRI 的优劣势

目录前言一、CGroup1.1 基本概念1.2 cgroupfs 驱动1.2.1 基本概念1.2.2 什么是 cgroup v21.2.3 cgroup v2 使用要求1.3 systemd cgroup 驱动1.3.1 基本概念1.3.2 kubelet 设置 cgroup 驱动二、CRI2.1 Containerd2.1.1 基本概念2.1.2 配置 CGroup 驱动2.2 CRI-O2.2.1 基本概念2.…

【LeetCode每日一题】【单调队列】2022-10-26 862. 和至少为K的最短子数组 Java实现

文章目录题目链接题目思路前缀和暴力法优化一优化二另一种写法题目链接 https://leetcode.cn/problems/shortest-subarray-with-sum-at-least-k/ 题目 思路 https://leetcode.cn/problems/shortest-subarray-with-sum-at-least-k/solution/liang-zhang-tu-miao-dong-dan-dia…

【电子通识】芯片资料(数据手册/规格书)查询常用网站和方法

目录 1.AlldataSheet 网站&#xff08;建议使用&#xff09; 2.ICpdf 网站 3.CIC中国IC网 网站 4.datasheet&#xff08;不建议使用&#xff09; 5.半导小芯 &#xff08;建议使用&#xff09; 6.立创商城 &#xff08;建议使用&#xff09; 在做硬件的芯片选型、产品维修…

MySQL体系结构

MySQL体系结构初识MySQLOLTPOLAPSQL数据库术语MySQL体系结构连接池缓冲组件执行select语句的过程总结后言初识MySQL 按照数据结构来组织、存储和管理数据的仓库&#xff1b;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 MySQL是关系型数据库&…

从位运算理解位图

位图是一种较难理解的数据结构&#xff0c;想了解位图&#xff0c;我需要先温习一下基础&#xff0c;复习下一些二进制的知识 位运算 1个字节8个二进制位 二进制每逢二进一&#xff0c;下面是二进制对应的十进制转换方式 二进制十进制0000 00012^010000 00102^120000 00112…

Shell编程案例

Shell编程案例 文章目录Shell编程案例熟悉shell编程的有关机制&#xff0c;如标准流。学习Linux环境变量设置文件及其内容/etc/profile/etc/bashrc/etc/environment~/.profile~/.bashrc熟悉编程有关基础命令技巧和规则sed掌握shell 程序执行的三种基本方式使用for循环语句,完成…

万字长文的CSS与JavaScript简易学习

近期学习web笔记&#xff0c;可供参考 目录 css: css导入方式&#xff1a; css选择器&#xff1a; javascript: javascript介绍&#xff1a; js引入方式&#xff1a; js书写语法&#xff1a; js变量&#xff1a; 5种原始类型&#xff1a; 运算符&#xff1a; JavaScr…

Spring Aop的学习(一):Spring Aop的简单入门

1. 什么是AOP AOP(Aspect Oriented Programming):面向切面编程,是OOP(面向对象编程)的一个延续,其和OOP一样,也是一种编程思想。不过AOP是一种横向开发模式。 2. AOP的作用及应用场景作用 AOP的主要作用就是减少代码量,提高代码的可重用性,有利于未来的可操作性与可维护性…