spark 的计算流程大概如图:

其中, 通过多次处理, 生成多个中间数据, 最后对结果进行操作获得数据. 本文不涉及任何原理, 仅总结spark在处理的时候支持的所有操作, 方便后面使用的时候, 可以参照本文进行数据的处理.
以下函数整理, 基与Python中RDD对象.
数据的转换操作
数据之间的转换操作, 用于生成中间数据.
| 方法名 | 说明 |
|---|---|
| 过滤 | |
| filter | 过滤掉函数计算后返回 false 的数据 |
| distinct | 对数据集中的元素进行去重. |
| 数据转换 | |
| map | 一对一. 方法用于对数据进行转换, 一个输入转换为一个输出 |
| flatMap | 一对多. 方法对数据进行转换, 一个输入转换为0或多个输出, 所以回调返回一个序列 |
| mapPartitions | 多对多. 数据转换批量. 方法对数据进行转换, 每次接收一个任务分区的数据集合进行处理, 同时返回一个转换后的数据序列. 作用类似map, 只是可以批量处理, 对优化性能有一定的帮助. |
| mapPartitionsWithIndex | 与mapPartitions方法类似, 不同的是此函数回调额外接收分区的序号. |
| 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等还有一些自己实现的方法来方便使用的, 没有在此列出. 留着后面写的时候作为参考, 毕竟英语是硬伤.