RDD.foreachPartition/foreach的操作

在这个action的操作中:

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

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

在fureach中,传入一个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进行处理.

最新文章

  1. 深入学习jQuery元素过滤
  2. 邮箱、手机号、中文 js跟php正则验证
  3. Fedora 24最新工作站版本之四大重要改进
  4. Java Hour 66 Spring 相关
  5. php读取memcahed java session
  6. 【Android框架进阶〖0〗】ThinkAndroid注解机制
  7. 浏览器自动化工具-Selenium
  8. Python中的 isdigit()方法
  9. bzoj1927: [Sdoi2010]星际竞速
  10. java web路径的问题
  11. zoj 3537 Cake(区间dp)
  12. uva 260 - Il Gioco dell'X
  13. 深刻理解Oracle数据库的启动和关闭 .
  14. servlet三种实现方式之二继承GenericServlet开发
  15. mysql的字符串处理函数
  16. Python入门(2)
  17. 50行代码实现的高性能动画定时器 raf-interval
  18. 简单类型对象 String
  19. java 导出blob图片到excel
  20. webzip怎么用 如何用webzip下载整个网站?

热门文章

  1. [ASP.NET]EF跨项目调用问题
  2. add Admob with Cocos2d-x on iOS
  3. 解决的方法:mysql_connect()不支持请检查mysql模块是否正确载入
  4. C语言之函数调用11—递归法求Hermite函数
  5. Android Camera解析(上) 调用系统相机拍摄照片
  6. Troubleshooting Failed Requests Using Tracing in IIS 8.5
  7. LightOJ--1094-- Farthest Nodes in a Tree(树的直径裸题)
  8. WCF:目录
  9. 求包含每个有序数组(共k个)至少一个元素的最小区间
  10. tomcat配置一个服务监听两个端口