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等还有一些自己实现的方法来方便使用的, 没有在此列出. 留着后面写的时候作为参考, 毕竟英语是硬伤.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值