前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你真知道如何高效用mapPartitions吗?

你真知道如何高效用mapPartitions吗?

作者头像
Spark学习技巧
发布2018-08-20 09:47:02
1.6K0
发布2018-08-20 09:47:02
举报
文章被收录于专栏:Spark学习技巧Spark学习技巧

做过一段时间spark的应用开发的小伙伴都会渐渐发现,很没趣,因为都是调API。那么,真的是没趣吗,还是说你本身没有去深入研究呢?通过本文你就会发现自己没成长是哪的问题了。

1. mappartition粗介

本问主要想讲如何高效的使用mappartition。

首先,说到mappartition大家肯定想到的是map和MapPartition的对比。网上这类教程很多了,以前浪尖也发过类似的,比如

对比foreach和foreachpartition

主要是map和foreach这类的是针对一个元素调用一次我们的函数,也即是我们的函数参数是单个元素,假如函数内部存在数据库链接、文件等的创建及关闭,那么会导致处理每个元素时创建一次链接或者句柄,导致性能底下,很多初学者犯过这种毛病。

而foreachpartition是针对每个分区调用一次我们的函数,也即是我们函数传入的参数是整个分区数据的迭代器,这样避免了创建过多的临时链接等,提升了性能。

下面的例子都是1-20这20个数字,经过map或者MapPartition然后返回a*3。

2. map栗子

代码语言:javascript
复制
val a = sc.parallelize(1 to 20, 2)def mapTerFunc(a : Int) : Int = {
    a*3}val mapResult = a.map(mapTerFunc)

println(mapResult.collect().mkString(","))

结果

代码语言:javascript
复制
3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60

3. mappartitions低效用法

大家通常的做法都是申请一个迭代器buffer,将处理后的数据加入迭代器buffer,然后返回迭代器。如下面的demo。

代码语言:javascript
复制
  val a = sc.parallelize(1 to 20, 2)  def terFunc(iter: Iterator[Int]) : Iterator[Int] = {    var res = List[Int]()    while (iter.hasNext)
    {      val cur = iter.next;
      res.::= (cur*3) ;
    }
    res.iterator
  }val result = a.mapPartitions(terFunc)
println(result.collect().mkString(","))

结果

代码语言:javascript
复制
30,27,24,21,18,15,12,9,6,3,60,57,54,51,48,45,42,39,36,33

4. mappartitions高效用法

注意,3中的例子,会在mappartition执行期间,在内存中定义一个数组并且将缓存所有的数据。假如数据集比较大,内存不足,会导致内存溢出,任务失败。 对于这样的案例,Spark的RDD不支持像mapreduce那些有上下文的写方法。其实,浪尖有个方法是无需缓存数据的,那就是自定义一个迭代器类。如下例:

代码语言:javascript
复制
class CustomIterator(iter: Iterator[Int]) extends Iterator[Int] {    def hasNext : Boolean = {
      iter.hasNext
    }    def next : Int= {    
    val cur = iter.next
    
     cur*3
    }
  }  
  val result = a.mapPartitions(v => new CustomIterator(v))
  println(result.collect().mkString(","))

结果:

代码语言:javascript
复制
3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60

是不是脑洞大开,要多学习的,同志们。

【完】

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浪尖聊大数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档