Scala函数式编程和Spark的联系

Scala中的一些概念是Spark中有相似的地方,在这里总结以下,以作为进一步的巩固

Scala的函数式编程

1.基本概念

   匿名函数
   闭包 (函数和上下文-函数和运行时的数据)
   函数科里化-柯里化 Curry --只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数
        带有多参数的函数转化为一系列函数,每个函数都只有一个参数
   偏函数
   递归- 尾递归
   函数式编程中的
    数据结构
    数据结构中的常见操作:
        通用的操作:
        各自特有的操作:
            flatter  map    == flatMap
            折叠:scan scanLeft scanRight-将中间结果放到新的集合,并将中间结果传递给一下函数调用
                     输入参数: 初始值和运算函数
                     返回值:中间结果新的集合
            规约: reduce
            聚合: sum  实际上调用的是 foldLeft
                     span 遇到不符合就停止
                     partition 对所有元素进行断言判断
            分组:按照条件将元素分组-根据提供的函数生成分组关键字

2.通用操作归类

01.映射与遍历 map   flatMap  foreach  Iterator  flatten filter filterNot  filterKeys mapValue
02.混洗    shuffle<隐式操作-对用户透明>
03.规约与聚合  fold  reduce  aggregate  max  min
04.分区和分组  partition  groupBy  grouped
05.数据变换 zip unzip  zipWithIndex concat   toArray toList  collect range
06.逻辑判断 empty  isEmpty contains containsSlice
07.查看  head tail  last init take drop  slice  size  count  find apply 
            indexOf lastIndexOf indexWhere  lastIndexWhere  indexOfSlice  lastIndexOfSlice
            startsWith endsWith
08.其他重要 drop dropWhile  take takeWhile
            排序: sorted sortWith sortBy 
            去重: distinct
            集合操作: diff  union intersect
            insert append
            add  remove clear  
            put  remove  clear   update  keys keySet values 
            trim
            pop push  update clear top
            get getOrElse
 09.其他不常见: 转置 transpose  反转 reverse  转换 transform
    mkString addString stringPrefix  copyToArray clone
    填充 fill 滑动 sliding

Spark 的一些内容

基于RDD的操作

RDD的类型-- RDD pairRDD
函数作用以及返回值类型
01. foreach 、map、flatMap
    foreach  对集合中每个元素进行操作  没有返回值
    map      对集合中每个元素进行操作
    flatMap     返回的迭代器的所有内容构成新的RDD
                    是一个序列化的数据而不是单个数据项-- a Seq
    区别
            map:对集合中每个元素进行操作。 
            flatMap:对集合中每个元素进行操作然后再扁平化。
02. fold 以及 reduce   aggragate
    fold 将中间结果传递给下一次函数调用,返回最后一次函数计算的结果-返回结果是一个单值,其类型与初始值相同
    共同点:返回的数据类型 
    不同点:fold需要提供初始值 fold foldLeft  foldRight
     reduce函数和fold  函数输入和输出数据类型 必须一致
    aggragate  并不要求返回结果的类型是集合元素类型的父类
        aggregate先对每个分区的元素做聚集,然后对所有分区的结果做聚集
    Aggregate
     eg:
        t.reduce(_ +_)
        t.fold(0)( _ +_)
        aggregate(0)(_+_,  (_,_)=>0)  seqop在遍历分区的时候更新结果, combop -分区汇总--并行有分区的情况下
        aggregate(0)(_+_,  _+_)
03.groupByKey 和reduceByKey
    groupByKey():--作用以及返回值类型 --对具有相同键的值进行分组
        groupByKey也是对每个key进行操作,但只生成一个sequence
        [K, Iterable[V]]
    reduceByKey()  ----------------------------   合并具有相同键的值
        规约,对具有键相同的值合并起来--返回 各键以及 对应键规约出来的结果值 组成的新的RDD
        对大数据进行复杂计算时,reduceByKey优于groupByKey
    AggregateByKey 根据Key的值来聚合--aggregateByKey调用的就是combineByKey方法
    combineByKey
        groupByKey()是对RDD中的所有数据做shuffle,根据不同的Key映射到不同的partition中再进行aggregate
        aggregateByKey()是先对每个partition中的数据根据不同的Key进行aggregate,然后将结果进行shuffle,完成各个partition之间的aggregate

    grouped 将对象分成固定大小组,且最后一组之前的组的大小必须相同,最后一组必须小于
    grouped 是根据元素数量分组
    groupBy 是根据计算的键值进行分组
             .reduceByKey(_+_, reduceNum)
04.分区执行mapPartitions   foreachPartition
   Spark提供基于分区的map和foreach
    mapPartitions   foreachPartition
    从算子的类型:
        foreachPartition应该属于action运算操作,而 mapPartitions 是在Transformation中
        返回值上:mapPartitions 返回值类型迭代器: Iterator[U]  该元素的迭代器
        应用场景上:
        mapPartitions可以获取返回值,继续在返回RDD上做其他的操作
         foreachPartition因为没有返回值并且是action操作,所以使用它一般都是在程序末尾比如说要落地数据到存储系统中如mysql,es,或者hbase中,
    02.并行度
            001.对于已知的RDD进行重分区
            002.数据混洗操作中,使用参数的方式为混洗后的RDD指定并行度
05.重分区:repartition   coalesce
    repartition() 把RDD随机打乱并分成设定的分区数目
    coalesce():减少分区--没有打乱
        对RDD的分区进行重新划分,repartition内部调用了coalesce,参数shuffle为true
          扩大分区
          减少分区
            coalesce算子,可以手动减少DataFrame的partition数量,并且不用触发shuffle,
            这也是coalesce跟repartition的区别
            repartition一定会触发shuffle
06.广播变量和累加器
 SparkContext 通过broadcast( ) 方法传递即将被广播的变量-返回Broadcast[T]
 从Driver 到任务,单向传播,没有办法更新
  通过accumulator( )方法创建一个累加器变量
07.leftOuterJoin连接操作

2.数据结构

    RDDDataFrameDataset全都是spark平台下的分布式弹性数据集
     RDD   PairRDDFunctions 
     三者都有partition的概念,
     三者都有惰性机制,在进行创建、转换,
        map方法时,不会立即执行,只有在遇到Actionforeach时,三者才会开始遍历运算
        DataFrameDataset进行操作许多操作都需要这个包进行支持-  import spark.implicits._
    DataFrame也可以叫Dataset[Row],
            每一行的类型是Row,不解析,每一行究竟有哪些字段,各个字段又是什么类型都无从得知
            Dataset中每一行是什么类型是不一定的

基于DataSet的操作

    DataSet数据类型的转化
        df.printSchema()
        foreach   foreachPartition  filter  flatMap  mapPartitions  transform
        reduce
        head()  take()  count()  isEmpty  where(
        collect()  collectAsList()
        persist()  storageLevel
        checkpoint()  coalesce  repartition  repartitionByRange(
        columns
        orderBy  sortWithinPartitions  sort
        groupByKey
        intersect  union 
        agg  groupBy
        join
        explain()

        provide common aggregations such as count(), countDistinct(), avg(), max(), min()
        UserDefinedAggregateFunction extends Serializable

blogroll

social