RDD是不可变型的,并且针对RDD的每个操作都将创建一个新的RDD。可以在RDD上执行两种类型的操作,即:action和transformation
1、transformation
transformation通过对现有RDD中的每个元素应用转换逻辑来生成新的RDD。一些转换函数可以对元素进行拆分、过滤或执行排序计算操作。
多个transformation算子可按顺序操作;但在transformation阶段,并不会真正执行任务。
对于transformation算子,Spark会将其加入包含了计算的DAG中。并且只有在driver需要数据时,该DAG才会真正执行。这种陈伟懒惰计算
transformation算子可以被分为以下四种类型:
1.1、 通用transformation算子
一些转换函数,可用于处理大部分通用性用户场景。常见的如聚集、过滤等。
- map
- filter
- flatMap
- groupByKey
- sortByKey
- combineByKey
1.2、数学统计transformation算子
即进行一些统计功能的算子。
- sampleByKey
- randomSpilt
1.3、集合/关系型transformation算子
用于完成对数据集进行连接的功能,或执行其他关系型代数函数。
- cogroup
- join
- subtractByKey
- fullOuterJoin
- leftOuterJoin
- rightOutJoin
1.4 、基于结构化数据的transformation算子
用于操作RDD底层数据或RDD分区,通过这些函数,可以直接操作分区而不用接触RDD内部的数据或元素。通常来说,可根据集群的状态和数据大小以及具体的用户场景,来重新考虑分区从而实现性能提升。
- partitionBy
- repartition
- zipwithIndex
- coalese
2、 action算子
action算子会触发DAG(有向无环图)中到现在为止创建的所有transformation算子。他会将这些transformation算子物化,然后执行对应的代码块和函数。此时由DAG指定的操作都将会被触发。
2.1 driver
dirver是action的其中一种算子,可以实现例如集合计数,按key计数等。此类action算子会在远程executor上执行某些操作,并将结果拉回到driver。
在大数据集上执行基于driver的action算子时,可能导致driver所在机器上的内存超载,从而导致应用运行失败,因此使用包含action算子的driver程序需要注意。
2.2 分布式action
分布式action在集群的所有节点执行。其例子为saveAsTextFile()。大部分的action算子都属于此类型。