大数据技术之spark算子

RDD转换算子

一、Value单值类型
1、Map
将处理的数据逐条进行映射转换,这里的转换可以是类型的转换,也可以是值的转换,通常后接匿名函数。
分区内的而数据执行是逻辑有序的,若是不同的分区,则数据逻辑执行是无序的。
2、mapPartitions
将待处理的数据以分区为单位发送到计算系欸但进行处理,任意的数据,把一个分区的数据全部拿到之后在做操作,在内存中进行操作,以分区为单位进行数据转换操作,但是会将整个数据加载到内存中进行引用如果是处理完的数据是不会被释放掉,存在对象的引用在内存较小,数据量较大的情况下,可能会使得内存溢出。
思考一个问题:map 和 mapPartitions 的区别?
数据处理角度:
Map算子是分区内的一个数据一个数据的执行,类似于串行惭怍,而mapPratitions算子是以分区为单位进行批处理操作
功能的角度:
Map主要目的是将数据源中的数据及您修改传唤和改变,但是不会较少或增多数据,mapPartitions算子需要传递一个迭代器,返回一个迭代器,没有要求的蒜素个数保持不变,所以可以增加或减少数据
性能的角度:
Map算子因为类似于串行操作,所以性能较低,而mapPratitions算子类似于不批处理操作,所以性能较高。但是mapPratitions算子会长时间占用内存,那么这样会导致呢哦村可能不够用,出现内存溢出的错误
使用建议:所以在内存有限的情况下,建议使用Map
3、mapPartitionsWithIndex
将待处理的数据一分区为单位发送到计算节点进行处理,这里的处理值得似乎可以及进行任意的处理,哪怕是过滤数据,在处理时候同时可以获取到当前分区的索引。
4、flatMap
将处理的数据进行扁平化后再进行映射处理,(类似scala中的扁平化,将两个数据源拆开打散)
5、glom
将同一个分区的数据直接转换为相同类型的内存数据进行处理,且分区不变,将一个分区的数据归为一个数组
6、groupBy
按照自己制定的规则对数据及逆行重新分组,而不是分区,分区默认不变,groupBy会把所有数据打乱,并且会将数据进行重新组合,此过程中会设计shuffle操作。
7、filter
将数据按照自己指定的规则进行筛选过滤,符合规则的数据保留,不符合规则的数据丢弃。当数据进行筛选过滤以后,分区内的数据可能不均衡。逻辑原理:当按照一定的规则进行筛选过滤以后,重新分配到各个分区中,可能会导致数据倾斜。

8、sample
按照指定的规则从数据源中抽取数据,再生产环境中,通常也用作抽样取样操作,对于庞大的数据量,取样能判断整体的数据结构,对于取样操作:通常有取样放回(泊松数据放回)和取样不放回操作(伯努利数据不放回)。取样放回会使得数据源不断扩大
参数解释:
第一个参数=>判断取样的数据是否放回,false 不放回,true 放回
第二个参数=>对于取样不放回:范围【0,1】该参数表示数据源中每条数据被抽取的概率。
对于取样放回:范围大于0,表示每一个元素被期望抽到的可能次数.
第三个参数:随机数种子,抽取数据时随机算法的种子 当把种子确定了之后,每次抽取的数据也就定了,如果不传递第三个参数,则每次执行的结果也就不一样
使用场景:在数据倾斜时候使用,应用场景比较广泛,例如在数据分析中,可以从海量数据中抽取一部分样本进行分析,以降低计算量和时间成本;在测试和调试时,可以从数据集中抽取一小部分数据进行验证;在机器学习中,可以采用随机抽样的方式划分训练集和测试集。
9、distinct
将数据源中重复的数据去重

10、coalesce
根据数据量缩减分区,用于大数据集过滤后,提高小数据集的执行效率,当spark中存在过多的小任务时候,可以通过coalesce方法,收缩合并分区,较小分区的个数,减小任务的调度成本。默认情况下 不会将现有分区的数据打乱重新按照规则组合。也可以扩大分区,但要设置shuffle参数为true,否则没有意义,不起作用
参数解释:第一个参数:表示将数据源缩小到几个分区
第二个参数:表示是否进行shuffle操作
11、repartition
等价于coalesce(shuffle=true)的操作,可以将分区通过shuffle进行扩大,也可以通过shuffle将分区缩小
12、sortBy
用于排序,在排序之前,可以将数据通过排序规则进行处理,之后将结果及逆行排序,默认为升序。排序之后新产生的RDD、分区数和原分区数一致,中间存在shuffle过程。底层有shuffle,将所有的数据全部重新排列,再进行分区
二、双value类型
1、交集
将两个数据源合在一起,但不进行去重操作 数据类型必须保持一致
2、并集
求两个数据源的公共部分 数据类型必须一致
3、差集
以一个RDD元素为主,去除两个RDD中重复元素,将其他元素保留下 数据类型保持一致
4、Zip
将两个 RDD 中的元素,以键值对的形式进行合并。其中,键值对中的 Key 为第 1 个 RDD 中的元素,Value 为第 2 个 RDD 中的相同位置的元素。
如果两个 RDD 数据类型不一致怎么办?
可以拉链,数据类型可以不一致,最后形成tuple
如果两个 RDD 数据分区不一致怎么办?
不能拉链,两个数据源要求分区数量要保持一致
如果两个 RDD 分区数据数量不一致怎么办?
不能拉链,两个数据源要求分区中数据数量保持一致(分区数一致,并且每个分区中的数据数量也要一致)
三、Key-value类型
1、partitionBy
将数据源按照指定的Partitioner 进行分区,spark默认的分区器是 HashPartitioner 。
如果重分区的分区器和当前 RDD 的分区器一样怎么办?
如果分区器的类型和数量完全一致,则不做二次分区
Spark 还有其他分区器吗?
HashPartitioner 、RangePartitioner
如果想按照自己的方法进行数据分区怎么办?
编写自己的分区器
2、reduceByKey
可以将数据按照相同的 Key 对 Value 进行聚合
3、groupByKey
将数据源的数据根据 key 对 value 进行分组 形成一个对偶元组
reduceByKey 和 groupByKey 的区别?
从 shuffle 的角度:reduceByKey 和 groupByKey 都存在 shuffle 的操作,但是 reduceByKey可以在 shuffle 前对分区内相同 key 的数据进行预聚合(combine)功能,这样会减少落盘的数据量,而 groupByKey 只是进行分组,不存在数据量减少的问题,reduceByKey 性能比较高。
从功能的角度:reduceByKey 其实包含分组和聚合的功能。GroupByKey 只能分组,不能聚合,所以在分组聚合的场合下,推荐使用 reduceByKey,如果仅仅是分组而不需要聚合。那么还是只能使用 groupByKey spark中。
Shuffle操作必须落盘(放入文件)处理,不能在内存中数据等待,会导致内存溢出,shuffle得操作性能非常低,因为要和磁盘交互而不是和内存交互reduceByKey 支持分区内预聚合功能,可以有效减少shuffle时落盘的数据量
4、aggregateByKey
将数据根据不同的规则进行分区内计算和分区间计算
第一个参数列表:需要传递一个参数,表示为初始值,主要用于碰见第一个key得时候,和value进行分区内计算
第二个参数列表:需要传递两个参数
第一个参数用于分区内计算
第二个参数用于分区间计算
aggregateByKey最终返回的数据结果应该和初始值的value类型保持一致,若分区内和分区间的计算规则相同,则使用foldByKey
5、foldByKey
当分区内计算规则和分区间计算规则相同时,aggregateByKey 就可以简化为 foldByKey
6、combineByKey
发现数据结构不满足要求时,可以让第一个数据转换结构。分区内和分区间计算规则不相同。
reduceByKey、foldByKey、aggregateByKey、combineByKey 的区别?
reduceByKey: 相同 key 的第一个数据不进行任何计算,分区内和分区间计算规则相同 FoldByKey: 相同 key 的第一个数据和初始值进行分区内计算,分区内和分区间计算规则相

AggregateByKey:相同 key 的第一个数据和初始值进行分区内计算,分区内和分区间计算规则可以不相同
CombineByKey:当计算时,发现数据结构不满足要求时,可以让第一个数据转换结构。分区内和分区间计算规则不相同。
7、Join
返回一个相同 key 对应的所有元素连接在一起形成一个tupl,不同数据源中 —>笛卡尔积,如果两个数据源中key没有匹配上,那么数据不会出现在结果中
8、leftOuterJoin
类似于 SQL 语句的左外连接
关于左外和右外 最明显的区别就是相同的key的value左右的位置
9、rightOuterJoin
类似于 SQL 语句的右外连接
10、cogroup
先对同一个数据源中的相同key进行分组,再对不同数据源中的相同key进行join连接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值