[Spark进阶]-- spark RDD中foreachPartition和foreach说明

本文详细介绍了Spark中RDD的foreachPartition和foreach操作。foreach用于对每个partition中的数据进行处理,但不保证处理的完整性和顺序;而foreachPartition则将iterator传递给用户定义的函数,允许更灵活的控制,尤其适用于处理大量数据,可以避免内存溢出问题。
摘要由CSDN通过智能技术生成

主题:RDD的foreachPartition/foreach的操作

 

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

一、foreach的操作

foreach中,传入一个function,这个函数的传入参数就是每个partition中,每次的foreach得到的一个rdd的kv实例,也就是具体的内容,

这种处理你并不知道这个iterator的foreach什么时候结果,只能是foreach的过程中,你得到一条数据,就处理一条数据.

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

 

def foreach(f: T => 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.

而不是直接使用iterator的foreach,这种情况下,如果是上面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的区别:

Foreach与ForeachPartition都是在每个partition中对iterator进行操作,

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

而foreachPartition是在每个partition中把iterator给传入的function,让function自己对iterator进行处理(可以避免内存溢出).

 

 

参考文章:http://blog.csdn.net/u014393917/article/details/50607437

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值