mapPartitions
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的更多相关文章
- map与mapPartitions
区别在于sc.map是将RDD下的所有行数据统计处理.而sc.mapPartitions是按RDD分区进行数据统计处理. 测试一下: val data = sc.parallelize(1 to 6, ...
- spark小技巧-mapPartitions
与map方法类似,map是对rdd中的每一个元素进行操作,而mapPartitions(foreachPartition)则是对rdd中的每个分区的迭代器进行操作.如果在map过程中需要频繁创建额外的 ...
- spark中map与mapPartitions区别
在spark中,map与mapPartitions两个函数都是比较常用,这里使用代码来解释一下两者区别 import org.apache.spark.{SparkConf, SparkContext ...
- Spark 学习笔记之 map/flatMap/filter/mapPartitions/mapPartitionsWithIndex/sample
map/flatMap/filter/mapPartitions/mapPartitionsWithIndex/sample:
- spark map和mapPartitions的区别
package dayo1 import org.apache.spark.{SparkConf, SparkContext} import scala.collection.mutable.Arra ...
- java实现spark常用算子之mapPartitions
import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...
- Spark API 之 map、mapPartitions、mapValues、flatMap、flatMapValues详解
原文地址:https://blog.csdn.net/helloxiaozhe/article/details/80492933 1.创建一个RDD变量,通过help函数,查看相关函数定义和例子: & ...
- spark中map和mapPartitions算子的区别
区别: 1.map是对rdd中每一个元素进行操作 2.mapPartitions是对rdd中每个partition的迭代器进行操作 mapPartitions优点: 1.若是普通map,比如一个par ...
- Spark算子--mapPartitions和mapPartitionsWithIndex
mapPartitions--Transformation类算子 代码示例 result mapPartitionsWithIndex--Transformation类算子 代码示例 result ...
随机推荐
- STL序列式容器学习总结
STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...
- 安装Python时遇到的api-ms-win-crt-runtime-l1-1-0.dll 丢失问题
api-ms-win-crt-runtime-l1-1-0.dll 丢失 电脑找不到api-ms-win-crt-runtime-l1-1-0.dll文件解决方法: 问题描述: 1.开机提示“api- ...
- ALGO-17_蓝桥杯_算法训练_乘积最大(DP)
问题描述 今年是国际数学联盟确定的“——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加. ...
- PHP在Linux下的套件LNMP
LNMP官网:https://lnmp.org/install.html 另外不要忘了Azkaban和WhereHows
- 【并发】基于 @Async和 CompletableFuture 实现并发异步操作
参考链接:Spring官方示例 User.java package hello; import com.fasterxml.jackson.annotation.JsonIgnorePropertie ...
- web环境中微信JS-SDK配置
一.公众号相关设置 首先,在公众号中进行JS安全域名的设置,在公众号设置-功能设置中选择JS接口安全域名,点击设置进入设置对话框.按照要求逐步进行,完成设置. 二.页面请求发送与处理 引入所需js: ...
- 把1,2,3…n*n 的数字按照顺时针螺旋的形式填入数字矩阵
从键盘输入一个整数(1~20)则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中.例如:输入数字2,则程序输出:1 24 3输入数字3,则程序输出:1 2 38 9 47 ...
- maven不同环境的profile配置
1.开发的时候经常需要加载不同的环境,比如本地开发环境dev,生产环境product.如果需要手动去修改的话就太麻烦了,自己实现了maven资源替换,然后多环境下的配置文件管理的demo,在此贴出来. ...
- computer、methods和watch
在vue中处理复杂的逻辑的时候,我们经常使用计算属性computer,但是很多时候,我们会把计算属性.方法和侦听器搞混淆,在 w3cplus.com的一篇文章中是这样总结这三者的. methods:正 ...
- ACM主要算法
ACM主要算法ACM主要算法介绍 初期篇 一.基本算法(1)枚举(poj1753, poj2965)(2)贪心(poj1328, poj2109, poj2586)(3)递归和分治法(4)递推(5)构 ...