map - 遍历元素并处理

定义

  • 参数为函数,T 比如为Int,U比如为Double类型.
  • map函数整体的返回值可为任意类型(比如可以是Double等等,和参数f的返回值类型保持一致)
def map[U : ClassTag](f: T => U): RDD[U]

例子

scala> val rdd=sc.parallelize(Array(1,2,3,4,5,6,7),2)
//参数函数
scala> rdd.map(x=>x*2).collect
res100: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14)
//简写
scala> rdd.map(_*2).collect
res99: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14)
//遍历元素并处理,返回值类型未必与原有元素类型一样
scala> rdd.map(_*2.1).collect
res101: Array[Double] = Array(2.1, 4.2, 6.300000000000001, 8.4, 10.5, 12.600000000000001, 14.700000000000001)

mapPartitions

定义

  • 参数为函数,且该函数参数类型为迭代器,返回值类型也为迭代器
def mapPartitions[U : ClassTag](f: Iterator[T] => Iterator[U], preservesPartitioning: Boolean = false): RDD[U]

例子

def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("wordcount").setMaster("local")val sc = new SparkContext(conf)val rdd = sc.parallelize(Array(1, 2, 3, 4, 5, 6, 7), 2)rdd.mapPartitions(myfun).foreach(println)def myfun(iter: Iterator[Int]): Iterator[Int] = {var res = for (e <- iter) yield e * 2res}}// Array[Int] = Array(2, 4, 6, 8, 10, 12, 14)

其他例子

scala> val rdd=sc.parallelize(Array(1,2,3,4,5,6,7),2)
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[145] at parallelize at <console>:24
//其中iter为Iterator类型,所以经过map处理后返回的也是Iterator类型
scala> rdd.mapPartitions(iter=>iter.map(_*2)).collect
res104: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14)
//对迭代器应用filter方法返回的还是迭代器类型
scala> rdd.mapPartitions(iter=>iter.filter(_%2==0)).collect
res15: Array[Int] = Array(2, 4, 6)

mapPartitionsWithIndex

这个只是上面那个加了个分区号而已

def mapPartitionsWithIndex[U : ClassTag](f: (Int, Iterator[T]) => Iterator[U], preservesPartitioning: Boolean = false): RDD[U]

例子

scala> val rdd = sc.parallelize(Array(1, 2, 3, 4, 5, 6, 7), 2)
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[5] at parallelize at <console>:24scala> rdd.mapPartitionsWithIndex((index,x)=>x.map(index+":"+_*2)).collect
res19: Array[String] = Array(0:2, 0:4, 0:6, 1:8, 1:10, 1:12, 1:14)

总结

  • 能用 mapPartitions的地方都可以用map解决
  • 两者的主要区别是调用的粒度不一样:map的输入变换函数是应用于RDD中每个元素,而mapPartitions的输入函数是应用于每个分区。
  • 有些时候比如连接数据库时用mapPartitions比较好,因为每次连接开销很大,每个分区连一次比每调用一次连接一次要好.
  • mapPartitionsWithIndex跟mapPartitions差不多,参数多了个分区号而已

scala map与mapPartitions区别相关推荐

  1. 【收藏】spark中map与mapPartitions区别

    两个函数最终处理得到的结果是一样的 mapPartitions比较适合需要分批处理数据的情况,比如将数据插入某个表,每批数据只需要开启一次数据库连接,大大减少了连接开支,伪代码如下: arrayRDD ...

  2. 尚硅谷大数据技术Spark教程-笔记02【SparkCore(核心编程,map、mapPartitions、mapPartitionsWithIndex、flatMap、glom、groupBy)】

    视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01[Spark(概述.快速上手.运行环境.运行架构)] 尚硅谷大数据技术Spark教 ...

  3. mapPartition方法与map方法的区别(转载)

    根据[1] 算子 作用 map 应用于RDD中每个元素 mapPartitions 应用于每个分区 根据[2]mapPartitions更容易OOM 代码如下: //生成10个元素3个分区的rdd a ...

  4. [react] props.children.map和js的map有什么区别?为什么优先选择react的?

    [react] props.children.map和js的map有什么区别?为什么优先选择react的? React.Children.map 能够处理未知数据类型,即使 React.childre ...

  5. Python reduce / map / filter 函数区别 - Python零基础入门教程

    目录 一.map 函数 二.reduce 函数 三.filter 函数 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 Pyth ...

  6. scala中map添加值_如何在Scala Map中反转键和值

    scala中map添加值 A Map is a data structure that stores data as key: value pair. 映射是一种将数据存储为键:值对的数据结构. Sy ...

  7. Java 8 Stream Api 中的 peek、map、foreach区别

    #1. 前言 我在Java8 Stream中讲述了 Java 8 Stream API 的一些内容.今天再看一下peek.map.foreach区别. 2. peek peek 操作接收的是一个 Co ...

  8. java中list,set,map集合的区别,及面试要点

    Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...

  9. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

最新文章

  1. 根据windows域名找ip
  2. Caffe---Pycaffe进行网络结构(xxx.prototxt)可视化
  3. js获取url中的参数,url中传递中文的时候通过js解码的方式
  4. php中的point用法,php strnatcmp()函数的用法总结
  5. C# 8中的范围类型(Range Type)
  6. controller控制器怎么写_I2C控制器编程_框架
  7. 一个简单的javascript节流器实现
  8. STM32F103 - CubeMX 的使用实例详细(03)- 时钟配置 - 最大72M时钟的设定
  9. 吴恩达都在做的AI农业到底有什么魔力?
  10. mysql search yum_mysql的yum安装与配置
  11. SQL常见错误及处理方法
  12. 严重: Servlet.service() for servlet [taotao-manager] in context with path [] threw exception [Request
  13. Java练习21:递归方法求n!
  14. 网络流专题(最大流与费用流)例题总结
  15. 简单工厂、工厂方法、抽象工厂区别
  16. 成功制作海报的十个简单法则
  17. 3.1 人工智能定义
  18. java中的double相乘-------保留精度
  19. 关于CMTS设备的一些备忘
  20. IIS 超简单部署免费https Let's Encrypt

热门文章

  1. java与数据类型相关的十个关键字_乐字节Java变量与数据类型之一:Java编程规范,关键字与标识符...
  2. 2008铁路旅客列车时刻表_重要消息!唐山站100多列旅客列车调整,12月30日起开始实行...
  3. matlab中用于离散系统求解的命令,MATLAB求解规划问题(线性规划, 整数规划, 非线性规划)...
  4. Android+usb+spi,Android设备如何使用USB的硬件接口
  5. mysql maven 自动生成_【图文经典版】maven自动生成dao层
  6. oracle如何设置权限,Oracle创建用户并设置权限
  7. android 串口一直打开_STM32之串口DMA接收不定长数据
  8. python创造订单失败_使用Python API创建新订单,get AttributeError:“str”对象没有属性“iteritems”...
  9. php根据图片地址获取图片原始高宽,Js获取图片原始宽高的实现代码
  10. double类型数据做加和操作时会丢失精度问题处理