一、算子概述

1、什么是算子

  • 指使一组数据转化为另一组数据的抽象。

    2、算子的重要作用

  • 算子越少,灵活性越低,实现业务逻辑越困难,反之亦然。

    3、MapReduce与Spark算子比较

  • MapReduce只有两个算子,map和reduce,绝大场景下需要进行复杂的编码才可以实现业务逻辑

  • Spark有八十多个算子,可以满足绝大部分要求

    二、Spark算子介绍与应用

    1、算子分类

    1、转换算子(Transformation)

    此类算子会延迟操作,等到action算子才会开始执行

    ①value型

  • Map:给定一个输入,通过map操作映射到一个新的元素输出

  • flatMap:给定一个输入,将所有结果打平成一个一维集合
  • glom:以分区为单位,每个分区形成一个数组
  • mapPartition:map操作是以每个元素为单位进行计算,mapPartition以分区进行计算
  • union:将两个RDD合成一个RDD,不去重
  • groupBy:输入与输出分区多对多
  • filter:过滤筛选
  • distinct:全局去重
  • cache算子:将RDD元素从磁盘缓存到内存,下次需要可以直接取

    ②key-value型

  • mapValues:针对(k,v)中的v进行map操作,而不对k进行操作

  • combineByKey:

createCombiner:对每个分区内的同组元素如何聚合,形成一个累加器
mergeValue:将前边的累加器与新遇到的值进行合并的方法
mergeCombiners:每个分区都是独立处理,故同一个键可以有多个累加器。如果有两个或者更多的分区都有对应同一个键的累加器,用方法将各个分区的结果进行合并。

  • reduceByKey:按Key聚合后按组进行规约,如求和,连接等
  • join:对k进行相当于inner join的操作,对v进行打平

    2、行动算子(Action)

    此类型的算子会触发SparkContext提交作业,触发RDD的执行

    ①无输出型:不落地到文件或者HDFS的操作

  • foreach

    ②HDFS输出型

  • saveAsTextFile

    ③Scala集合和数据类型

  • 将RDD返回成一个Scala Array数组

    ④collectAsMap算子

  • 将RDD的kv对形式返回成一个Scala Map集合

    ⑤lookup算子

  • 对(k,v)型的RDD进行操作,返回含有指定k的V的所有值

    ⑥reduce算子

  • 先对两个元素进行reduce函数操作,然后将结果和迭代器取出的下一个元素进行reduce函数操作,直到迭代器遍历完所有元素,得到最后结果。

    ⑦fold算子

    //和是41,公式=(1+2+3+4+5+6+10)+10
    sc.parallelize(List(1, 2, 3, 4, 5, 6), 1).fold(10)(+)
    //和是51,公式=(1+2+3+10)+(4+5+6+10)+10=51
    sc.parallelize(List(1, 2, 3, 4, 5, 6), 2).fold(10)(+)
    //和是61,公式=(1+2+10)+(3+4+10)+(5+6+10)+10=61
    sc.parallelize(List(1, 2, 3, 4, 5, 6), 3).fold(10)(+)