mapPartitions操作与 map类似,只不过映射的参数由RDD中的每一个元素变成了RDD中每一个分区的迭代器,如果映射过程需要频繁创建额外的对象,使用mapPartitions操作要比map操作效率高效许多。比如将RDD中的所有数据通过JDBC链接写入数据库,如果使用map函数,可能要为每个元素创建一个connection,开销很大。如果使用mapPartitions,那么只需要针对一个分区建立connection.

Scala中的yield的主要作用是记住每次迭代中的有关值,并逐一存入到一个数组中。

for {子句} yield {变量或表达式}

scala> val numrdd=sc.makeRDD(1 to 10,3)

numrdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[51] at makeRDD at <console>:25

scala> def sumn(iter:Iterator[Int])={val aa=for(i<-iter) yield i*2;aa.toIterator}

sumn: (iter: Iterator[Int])Iterator[Int]

scala> numrdd.mapPartitions(sumn).collect

res49: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

-----------------------------------------------

分区中的数值求和

scala> val numRDD=sc.makeRDD(1 to 10,3)
numRDD: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[210] at makeRDD at <console>:25

scala> numRDD.mapPartitions(x=>{val result=List(); var i=0;while(x.hasNext){i+=x.next()};result.::(i).toIterator}).collect
res136: Array[Int] = Array(6, 15, 34)

scala> numRDD.mapPartitions(x=>{

val result=List();

var i=0;

while(x.hasNext)

{

i+=x.next()

};

result.::(i).toIterator

}

).collect
res136: Array[Int] = Array(6, 15, 34)

-------------------------------------------------------------

scala> val numRDD=sc.makeRDD(1 to 10,3)

numRDD: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[4] at makeRDD at <console>:24

scala> def partionsum(iter:Iterator[Int])={var result=List[Int]();var i:Int= 0;while(iter.hasNext){var n:Int=iter.next; i += n;} ;result.::(i).toIterator}
partionsum: (iter: Iterator[Int])Iterator[Int]

scala> def partionsum(iter:Iterator[Int])={

var result=List[Int]();

var i:Int= 0;

while(iter.hasNext){

var n:Int=iter.next;

i += n;

} ;

result.::(i).toIterator

}
partionsum: (iter: Iterator[Int])Iterator[Int]

scala> numRDD.mapPartitions(partionsum).collect

res7: Array[Int] = Array(6, 15, 34)

--------------------------------------

分区内的数值进行求和,并展示分区号

scala> val numRDD=sc.makeRDD(1 to 10,3)

numRDD: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[4] at makeRDD at <console>:24

scala> numRDD.mapPartitionsWithIndex((x,iter)=>{val result=List(); var i=0;while(iter.hasNext){i+=iter.next()};result.::(x+"|"+i).toIterator}).collect
res138: Array[String] = Array(0|6, 1|15, 2|34)

scala> numRDD.mapPartitionsWithIndex((x,iter)=>{

val result=List();

var i=0;

while(iter.hasNext){

i+=iter.next()

};

result.::(x+"|"+i).toIterator

}).collect

res138: Array[String] = Array(0|6, 1|15, 2|34)

------------------------------

scala> val numRDD=sc.makeRDD(1 to 10,3)

numRDD: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[4] at makeRDD at <console>:24

scala> def partionwithindexsum(x:Int,iter:Iterator[Int])={var result=List[Int]();var i:Int= 0;while(iter.hasNext){var n:Int=iter.next; i += n;} ;result.::(x+"|"+i).toIterator} partionwithindexsum: (x: Int, iter: Iterator[Int])Iterator[Any]

scala> def partionwithindexsum(x:Int,iter:Iterator[Int])={

var result=List[Int]();

var i:Int= 0;

while(iter.hasNext){

var n:Int=iter.next;

i += n;

} ;

result.::(x+"|"+i).toIterator

}

partionwithindexsum: (x: Int, iter: Iterator[Int])Iterator[Any]

scala> numRDD.mapPartitionsWithIndex(partionwithindexsum).collect

res9: Array[Any] = Array(0|6, 1|15, 2|34)

----------------------

统计每个分区的元素数

scala> val numRDD=sc.makeRDD(1 to 10,3)

numRDD: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[4] at makeRDD at <console>:24

scala> def partionwithindexlength(x:Int,iter:Iterator[Int])={var result=List[Int]();var i:Int= iter.toList.length;result.::(x+"|"+i).toIterator}

partionwithindexlength: (x: Int, iter: Iterator[Int])Iterator[Any]

scala> def partionwithindexlength(x:Int,iter:Iterator[Int])={

var result=List[Int]();

var i:Int= iter.toList.length;

result.::(x+"|"+i).toIterator

}

partionwithindexlength: (x: Int, iter: Iterator[Int])Iterator[Any]

scala> numRDD.mapPartitionsWithIndex(partionwithindexlength).collect

res10: Array[Any] = Array(0|3, 1|3, 2|4)

mapPartitions的更多相关文章

  1. map与mapPartitions

    区别在于sc.map是将RDD下的所有行数据统计处理.而sc.mapPartitions是按RDD分区进行数据统计处理. 测试一下: val data = sc.parallelize(1 to 6, ...

  2. spark小技巧-mapPartitions

    与map方法类似,map是对rdd中的每一个元素进行操作,而mapPartitions(foreachPartition)则是对rdd中的每个分区的迭代器进行操作.如果在map过程中需要频繁创建额外的 ...

  3. spark中map与mapPartitions区别

    在spark中,map与mapPartitions两个函数都是比较常用,这里使用代码来解释一下两者区别 import org.apache.spark.{SparkConf, SparkContext ...

  4. Spark 学习笔记之 map/flatMap/filter/mapPartitions/mapPartitionsWithIndex/sample

    map/flatMap/filter/mapPartitions/mapPartitionsWithIndex/sample:

  5. spark map和mapPartitions的区别

    package dayo1 import org.apache.spark.{SparkConf, SparkContext} import scala.collection.mutable.Arra ...

  6. java实现spark常用算子之mapPartitions

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  7. Spark API 之 map、mapPartitions、mapValues、flatMap、flatMapValues详解

    原文地址:https://blog.csdn.net/helloxiaozhe/article/details/80492933 1.创建一个RDD变量,通过help函数,查看相关函数定义和例子: & ...

  8. spark中map和mapPartitions算子的区别

    区别: 1.map是对rdd中每一个元素进行操作 2.mapPartitions是对rdd中每个partition的迭代器进行操作 mapPartitions优点: 1.若是普通map,比如一个par ...

  9. Spark算子--mapPartitions和mapPartitionsWithIndex

    mapPartitions--Transformation类算子 代码示例 result   mapPartitionsWithIndex--Transformation类算子 代码示例 result ...

随机推荐

  1. PREV-2_蓝桥杯_打印十字图

    问题描述 小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示: ..$$$$$$$$$$$$$....$...........$..$$$.$$$$$$$$$.$$$$...$...... ...

  2. 【ActiveMQ】之安全机制(二)客户端连接安全

    配置完管控台的安全之后,我们还要配置客户端连接安全,否则大家都可以往MQ上发送消息,这样太危险! 根据官方文档,http://activemq.apache.org/security.html Act ...

  3. uoj#209. 【UER #6】票数统计

    http://uoj.ac/problem/209 当x!=y时,这个限制条件是确定的,可以枚举总通过数,用组合数计算,当x==y时,这个限制条件表示前x个全部通过或后x个全部通过,只有最大的x有用, ...

  4. Console.WriteLine的小用法

    我在一开始使用Console.WriteLine的时候,经常采用的是拼接字符串的形式来构建输出. 但是Console.WriteLine具有扩展的方法来对内容进行输出,类似于我们常用的String.F ...

  5. linux下配置java环境

    1.首先要去下载好JDK Java SE 8的官方网址是http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2 ...

  6. 信息安全-加密:AES 加密

    ylbtech-信息安全-加密:AES 加密 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一 ...

  7. ueditor 正在读取目录

    ueditor 版本为1.3.6  项目版本为2.0 引用 <script src="../ueditor/ueditor.config.js" type="tex ...

  8. optparse模块解析命令行参数的说明及优化

    一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...

  9. 利用WordPress REST API 开发微信小程序从入门到放弃

    自从我发布并开源WordPress版微信小程序以来,很多WordPress网站的站长问有关程序开发的问题,其实在文章:<用微信小程序连接WordPress网站>讲述过一些基本的要点,不过仍 ...

  10. jscs sublime 插件配置 .jscsrc 文件

    { "disallowEmptyBlocks": true, "disallowKeywordsOnNewLine": ["else", & ...