Spark算子分类详解

@Author  : Spinach | GHB
@Link    : http://blog.csdn.net/bocai8058

0 算子常见分类

从大方向来说,Spark算子大致可以分为以下两类:

  1. Transformation变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理。
  • Transformation 操作是延迟计算的,也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行,需要等到有 Action 操作的时候才会真正触发运算。
  1. Action 行动算子:这类算子会触发 SparkContext 提交 Job 作业。
  • Action 算子会触发 Spark 提交作业(Job),并将数据输出 Spark系统。

从小方向来说,Spark 算子大致可以分为以下三类:

  1. Value数据类型的Transformation算子,这种变换并不触发提交作业,针对处理的数据项是Value型的数据。

  2. Key-Value数据类型的Transfromation算子,这种变换并不触发提交作业,针对处理的数据项是Key-Value型的数据对。

  3. Action算子,这类算子会触发SparkContext提交Job作业。

1 Transformation函数和Action函数

Transformation函数

Transformation函数 描述 类型
map 将原来 RDD 的每个数据项通过 map 中的用户自定义函数f映射转变为一个新的元素。源码中map算子相当于初始化一个RDD, 新RDD叫做MappedRDD(this, sc.clean(f))。 Value数据类型,输入分区与输出分区一对一型
flatMap 将原来 RDD 中的每个元素通过函数f转换为新的元素,并将生成的RDD的每个集合中的元素合并为一个集合,内部创建FlatMappedRDD(this,sc.clean(f))。 Value数据类型,输入分区与输出分区一对一型
mapPartitions 获取到每个分区的迭代器,在函数中通过这个分区整体的迭代器对整个分区的元素进行操作。 内部实现是生成MapPartitionsRDD。 Value数据类型,输入分区与输出分区一对一型
glom glom函数将每个分区形成一个数组,内部实现是返回的GlommedRDD。 Value数据类型,输入分区与输出分区一对一型
union 使用 union 函数时需要保证两个RDD元素的数据类型相同,返回的RDD数据类型和被合并的RDD元素数据类型相同,并不进行去重操作,保存所有元素。 Value数据类型,输入分区与输出分区多对一型
cartesian 对两个RDD内的所有元素进行笛卡尔积操作。操作后,内部实现返回CartesianRDD。 Value数据类型,输入分区与输出分区多对一型
grouBy 将元素通过函数生成相应的 Key,数据就转化为Key-Value格式,之后将Key相同的元素分为一组。 Value数据类型,输入分区与输出分区多对多型
filter 对元素进行过滤,对每个元素应用f函 数,返回值为true的元素在RDD中保留,返回值为false的元素将被过滤掉。内部实现相当于生成FilteredRDD(this,sc.clean(f))。 Value数据类型,输出分区为输入分区子集型
distinct 将RDD中的元素进行去重操作。图9中的每个方框代表一个RDD分区,通过distinct函数,将数据去重。 Value数据类型,输出分区为输入分区子集型
subtract subtract相当于进行集合的差操作,RDD 1去除RDD 1和RDD 2交集中的所有元素。 Value数据类型,输出分区为输入分区子集型
sample sample 将 RDD 这个集合内的元素进行采样,获取所有元素的子集。用户可以设定是否有放回的抽样、百分比、随机种子,进而决定采样方式。内部实现是生成SampledRDD(withReplacement, fraction, seed)。 Value数据类型,输出分区为输入分区子集型
takeSample takeSample()函数和上面的sample函数是一个原理,但是不使用相对比例采样,而是按设定的采样个数进行采样,同时返回结果不再是RDD,而是相当于对采样后的数据进行Collect(),返回结果的集合为单机的数组。 Value数据类型,输出分区为输入分区子集型
cache cache 将 RDD 元素从磁盘缓存到内存。 相当于 persist(MEMORY_ONLY) 函数的功能。 Value数据类型,Cache型
persist persist 函数对 RDD 进行缓存操作。数据缓存在哪里依据 StorageLevel 这个枚举类型进行确定。 Value数据类型,Cache型
mapValues 针对(Key, Value)型数据中的 Value 进行 Map 操作,而不对 Key 进行处理。 Key-Value数据类型,输入分区与输出分区一对一
combineByKey 只是两个值合并成一个值。 Key-Value数据类型,单个RDD聚集
reduceByKey reduceByKey 是比 combineByKey 更简单的一种情况,只是两个值合并成一个值,( Int, Int V)to (Int, Int C),比如叠加。 Key-Value数据类型,单个RDD聚集
partitionBy 对RDD进行分区操作。 Key-Value数据类型,单个RDD聚集
Cogroup 将两个RDD进行协同划分。 Key-Value数据类型,两个RDD聚集
join 对两个需要连接的 RDD 进行 cogroup函数操作,将相同 key 的数据能够放到一个分区,在 cogroup 操作之后形成的新 RDD 对每个key 下的元素进行笛卡尔积的操作,返回的结果再展平,对应 key 下的所有元组形成一个集合。最后返回 RDD[(K, (V, W))]。 Key-Value数据类型,连接
leftOutJoin和rightOutJoin LeftOutJoin(左外连接)和RightOutJoin(右外连接)相当于在join的基础上先判断一侧的RDD元素是否为空,如果为空,则填充为空。 如果不为空,则将数据进行连接运算,并返回结果。 Key-Value数据类型,连接

Action函数

Action函数 描述 类型
foreach 对 RDD 中的每个元素都应用 f 函数操作,不返回 RDD 和 Array, 而是返回Uint。 无输出
saveAsTextFile 将数据输出,存储到 HDFS 的指定目录。 HDFS
saveAsObjectFile 将分区中的每10个元素组成一个Array,然后将这个Array序列化,映射为(Null,BytesWritable(Y))的元素,写入HDFS为SequenceFile的格式。 HDFS
collect collect 相当于 toArray, toArray 已经过时不推荐使用, collect 将分布式的 RDD 返回为一个单机的 scala Array 数组。在这个数组上运用 scala 的函数式操作。 Scala集合和数据类型
collectAsMap 对(K,V)型的RDD数据返回一个单机HashMap。 对于重复K的RDD元素,后面的元素覆盖前面的元素。 Scala集合和数据类型
reduceByKeyLocally 先reduce再collectAsMap的功能,先对RDD的整体进行reduce操作,然后再收集所有结果返回为一个HashMap。 Scala集合和数据类型
lookup 对(Key,Value)型的RDD操作,返回指定Key对应的元素形成的Seq。 Scala集合和数据类型
count 返回整个 RDD 的元素个数。 Scala集合和数据类型
top 返回最大的k个元素。 Scala集合和数据类型
reduce reduce函数相当于对RDD中的元素进行reduceLeft函数的操作。 Scala集合和数据类型
fold fold和reduce的原理相同,但是与reduce不同,相当于每个reduce时,迭代器取的第一个元素是zeroValue。 Scala集合和数据类型
aggregate 先对每个分区的所有元素进行aggregate操作,再对分区的结果进行fold操作。 Scala集合和数据类型

引用:https://blog.csdn.net/dream0352/article/details/62229977


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章