• spark源代码action系列-foreach与foreachPartition


    RDD.foreachPartition/foreach的操作

    在这个action的操作中:

    这两个action主要用于对每一个partition中的iterator时行迭代的处理.通过用户传入的functioniterator进行内容的处理.

    首先我们先看看foreach的操作:

    fureach,传入一个function,这个函数的传入參数就是每一个partition,每次的foreach得到的一个rddkv实例,也就是详细的内容,这样的处理你并不知道这个iteratorforeach什么时候结果,仅仅能是foreach的过程中,你得到一条数据,就处理一条数据.

    由以下的红色部分能够看出,foreach操作是直接调用了partition中数据的foreach操作.

    def foreach(f: => Unit): Unit withScope {
      val cleanF = sc.clean(f)
      sc.runJob(this(iter: Iterator[T]) => iter.foreach(cleanF))
    }

    演示样例说明:

    val list = new ArrayBuffer()

    Rdd.foreach(record => {

      list += record

      If (list.size >= 10000) {

        list.flush....

      }

    })

    上面这段演示样例代码中,假设这么使用就会存在一个问题,

    迭代的最后,list的结果可能还没有达到10000条,这个时候,你在内部的处理的flush部分就不会运行,也就是迭代的最后假设没有达到10000的数据就会丢失.

    所以在foreach中,一般就是拿到一条数据进行下处理Rdd.foreach(record => {record._1 == a return})

     

    然后接下来看看foreachPartition:

    这个函数也是依据传入的function进行处理,但不同处在于,这里function的传入參数是一个partition相应数据的iterator.而不是直接使用iteratorforeach,

    这样的情况下,假设是上面foreach的演示样例代码中list这个片段在这个action中就行正常的去处理.

    def foreachPartition(f: Iterator[T] => Unit): Unit withScope {
      val cleanF = sc.clean(f)
      sc.runJob(this, (iter: Iterator[T]) => cleanF(iter))
    }

     

    演示样例代码:

    Val list = new ArrayBuffer

    rdd.foreachPartition(it => {

      It.foreach(r => {

    List += r

    If (list.size > 10000) flush

      })

      If (list.size > 0) flush

    })

     

    最后说下这两个action的差别:

    ForeachforeachPartition都是在每一个partition中对iterator进行操作,

    不同的是,foreach是直接在每一个partition中直接对iterator运行foreach操作,而传入的function仅仅是在foreach内部使用,

    foreachPartition是在每一个partition中把iterator给传入的function,function自己对iterator进行处理.

  • 相关阅读:
    Passbook教程中生成pass时遇到的“Couldn't find a passTypeIdentifier in the pass”
    几个app maker的网站
    forever start Error: Cannot find module './daemon.v0.10.26'
    [Effective Objective-C 读书笔记] 第1章 几条基本写法 (2~5条)
    在linux环境下配置node:node + npm + forever
    [技术翻译] 构建现代化的Objective-C (下)
    [技术翻译]构建现代化的 Objective-C (上)
    NSDate与 NSString 、long long类型的相互转化
    Java对象的序列化与反序列化:默认格式及JSON格式(使用jackson)
    基本网络请求
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7073861.html
Copyright © 2020-2023  润新知