Spark中的算子都有哪些
总的来说,spark分为三大类算子:
- 
Transformation 变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理; Transformation 操作是延迟计算的,也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行,需要等到有 Action 操作的时候才会真正触发运算
 - 
Action 行动算子:这类算子会触发 SparkContext 提交 Job 作业; Action 算子会触发 Spark 提交作业(Job),并将数据输出 Spark系统
 - controller 控制操作:Spark中控制算子也是懒执行的,需要Action算子触发才能执行,主要是为了对数据进行缓存。
控制算子有三种,cache,persist,(RDD 持久化原理)checkpoint,以上算子都可以将RDD持久化,持久化的单位是partition。cache和persist都是懒执行的。必须有一个action类算子触发执行。checkpoint算子不仅能将RDD持久化到磁盘,还能切断RDD之间的依赖关系。 
1. Value数据类型的Transformation算子
输入分区与输出分区一对一型
- map算子
 - flatMap算子
 - mapPartitions算子
 - glom算子
 
输入分区与输出分区多对一型
- union算子
 - cartesian算子
 
输入分区与输出分区多对多型
- 
grouBy算子
输出分区为输入分区子集型
 - filter算子
 - distinct算子
 - subtract算子
 - sample算子
 - takeSample算子
 
Cache型
- cache算子
 - persist算子
 
2. Key-Value数据类型的Transfromation算子
输入分区与输出分区一对一
- mapValues算子
 
对单个RDD或两个RDD聚集
- combineByKey算子
 - reduceByKey算子
 - partitionBy算子
 - 
Cogroup算子
连接
 - join算子
 - leftOutJoin 和 rightOutJoin算子
 
3. Action算子
无输出
- foreach算子
 
HDFS算子
- saveAsTextFile算子
 - saveAsObjectFile算子
 
Scala集合和数据类型
- collect算子
 - collectAsMap算子
 - reduceByKeyLocally算子
 - lookup算子
 - count算子
 - top算子
 - reduce算子
 - fold算子
 - aggregate算子
 - countByValue
 - countByKey
 
RDD 中 reduceBykey 与 groupByKey 哪个性能好,为什么
reduceByKey:reduceByKey 会在结果发送至 reducer 之前会对每个 mapper 在本地进行 merge,有点类似于在 MapReduce 中的 combiner。这样做的好处在于,在 map 端进行一次 reduce 之后,数据量会大幅度减小,从而减小传输,保证 reduce 端能够更快的进行结果计算。
groupByKey:groupByKey 会对每一个 RDD 中的 value 值进行聚合形成一个序列 (Iterator),此操作发生在 reduce 端,所以势必会将所有的数据通过网络进行传输,造成不必要的浪费。同时如果数据量十分大,可能还会造成 OutOfMemoryError。
所以在进行大量数据的 reduce 操作时候建议使用 reduceByKey。不仅可以提高速度,还可以防止使用 groupByKey 造成的内存溢出问题。










