转载前备注:
下面的实验全部在spark-shell中运行即可
#-------------------------------------------------------------------------
HDFS到HDFS过程

看看map 和flatmap的位置

Flatmap 和map 的定义
map()是将函数用于RDD中的每个元素,将返回值构成新的RDD。

flatmap()是将函数应用于RDD中的每个元素,将返回的迭代器的所有内容构成新的RDD

例子:

val rdd = sc.parallelize(List(“coffee panda”,“happy panda”,“happiest panda party”))

输入

rdd.map(x=>x).collect

结果

res9: Array[String] = Array(coffee panda, happy panda, happiest panda party)

输入

rdd.flatMap(x=>x.split(" ")).collect

结果

res8: Array[String] = Array(coffee, panda, happy, panda, happiest, panda, party)

flatMap说明白就是先map然后再flat,再来看个例子

scala>val rdd1 = sc.parallelize(List(1,2,3,3))
scala> rdd1.map(x=>x+1).collect

res10: Array[Int] = Array(2, 3, 4, 4)

scala> rdd1.flatMap(x=>x.to(3)).collect

res11: Array[Int] = Array(1, 2, 3, 2, 3, 3, 3)

map(func)
将原数据的每个元素传给函数func进行格式化,返回一个新的分布式数据集。(原文:Return a new distributed dataset formed by passing each element of the source through a function func.)

flatMap(func)
跟map(func)类似,但是每个输入项和成为0个或多个输出项(所以func函数应该返回的是一个序列化的数据而不是单个数据项)。(原文:Similar to map, but each input item can be mapped to 0 or more output items (so func should return a Seq rather than a single item).)

Flatmap 和map 使用说明
在使用时map会将一个长度为N的RDD转换为另一个长度为N的RDD;而flatMap会将一个长度为N的RDD转换成一个N个元素的集合,然后再把这N个元素合成到一个单个RDD的结果集。

比如一个包含三行内容的数据文件“README.md”。

在spark中map函数和flatMap函数是两个比较常用的函数。其中
map:对集合中每个元素进行操作。
flatMap:对集合中每个元素进行操作然后再扁平化。

例如:

val arr=sc.parallelize(Array(("A",1),("B",2),("C",3)))
arr.flatmap(x=>(x._1+x._2)).foreach(println)

输出结果为

A1

B2

C3

如果用map

val arr=sc.parallelize(Array(("A",1),("B",2),("C",3)))
arr.map(x=>(x._1+x._2)).foreach(println)

输出结果

A1

B2

C3

所以flatMap扁平化意思大概就是先用了一次map之后对全部数据再一次map。

Flatmap 和map 实际使用场景
有一个场景,在字符串中如何统计相邻字符对出现的次数。意思就是如果有A;B;C;D;B;C字符串,则(A,B),(C,D),(D,B)相邻字符对出现一次,(B,C)出现两次。

统计相邻字符对出现次数代码如下

scala>  val data="A;B;C;D;B;D;C;B;D;A;E;D;C;A;B"
scala> val data_rdd=sc.parallelize(List(data))
scala> data_rdd.map(_.split(";")).flatMap(x=>{ for(i<-0 until x.length-1) yield (x(i)+","+x(i+1),1)  }).reduceByKey(_+_).foreach(println)

输出结果为

(E,D,1)
(C,A,1)
(A,E,1)
(B,D,2)
(D,B,1)
(A,B,2)
(C,D,1)
(D,C,2)
(C,B,1)
(D,A,1)
(B,C,1)

其中
+

表示任选两个不重叠的相邻的元素
map操作我记得的有map(一条对一条),mapToPair(map成键值对),flatMap(一条记录变n条(n>=0))

Flatmap 和map 区别
map(func)函数会对每一条输入进行指定的func操作,然后为每一条输入返回一个对象;而flatMap(func)也会对每一条输入进行执行的func操作,然后每一条输入返回一个相对,但是最后会将所有的对象再合成为一个对象;从返回的结果的数量上来讲,map返回的数据对象的个数和原来的输入数据是相同的,而flatMap返回的个数则是不同的。

map函数会对每一条输入进行指定的操作,然后为每一条输入返回一个对象;而flatMap函数则是两个操作的集合——正是“先映射后扁平化”:

操作1:同map函数一样:对每一条输入进行指定的操作,然后为每一条输入返回一个对象

操作2:最后将所有对象合并为一个对象

通过上图可以看出,flatMap其实比map多的就是flatten操作。

spark RDD 的map与flatmap区别说明(转)相关推荐

  1. map and flatmap 区别

    2019独角兽企业重金招聘Python工程师标准>>> map vs flatMap in Spark September 24, 2014Big Dataexample, spar ...

  2. java8中的map与flatmap区别

    map:只能返回一个值 flatmap:返回多个值 new ArrayList().stream().map(x -> x);//返回一个 new ArrayList().stream().fl ...

  3. java8 flatmap与map_java8中map和flatMap区别

    1.函数定义比较 map注释: /** * Returns a stream consisting of the results of applying the given * function to ...

  4. map 和 flatMap 区别

    区别 这两个在本质上是一样的,都是 map 操作,即对流形式的传入数据进行处理返回一个数据.但是区别方面从字面上就可以体现出来,flatMap 比 map 多了一个 flat 操作,也就是 " ...

  5. Spark RDD API:Map和Reduce

    参考文章: http://blog.csdn.net/jewes/article/details/39896301 http://homepage.cs.latrobe.edu.au/zhe/Zhen ...

  6. Spark RDD API详解(一) Map和Reduce

    来源:http://blog.csdn.net/jewes/article/details/39896301 本文由cmd markdown编辑,原始链接:https://www.zybuluo.co ...

  7. Spark中 RDD之coalesce与repartition区别

    Spark中 RDD之coalesce与repartition区别 coalesce def coalesce(numPartitions: Int, shuffle: Boolean = false ...

  8. Stream中map和flatmap的区别,一看就懂

    在日常开发中,我们经常会使用Stream来处理集合的操作. 其中,map是我们经常用到的api方法,同时呢,Stream也给我们提供了flatmap的方法. 这时候很多小伙伴就会搞不懂,这map和fl ...

  9. Spark学习之Spark RDD算子

    个人主页zicesun.com 这里,从源码的角度总结一下Spark RDD算子的用法. 单值型Transformation算子 map /*** Return a new RDD by applyi ...

最新文章

  1. 华为存储iscsi配置_iscsi 华为存储配置 上课内容
  2. CYQ.Data 轻量数据层之路 使用篇三曲 MAction 取值赋值(十四)
  3. 华人计算机大牛刘炯朗教授仙逝,他是姚期智院士的博士导师,还著有离散数学教科书...
  4. 《那些年啊,那些事——一个程序员的奋斗史15》
  5. sqlserver的基本介绍
  6. Deeplearnng.AI第四部分第二周、经典网络
  7. java I/O系统总结
  8. Gateway网关-过滤器链执行顺序
  9. iOS 开发和部署过程概述
  10. 打开WORD 2003时提示发现错误,需要关闭,还要发送错误报告给Microsoft 解决方案...
  11. Android SDK环境变量配置(windows和Linux)
  12. Linux并非无毒 十五年病毒简史
  13. EMC RS485接口EMC电路设计方案
  14. .mdf数据库恢复mysql_只有mdf文件和ldf文件,怎么恢复数据库。
  15. Java程序设计 试卷A
  16. 专利检索及分析模拟登陆(python)
  17. HDU1087 噜啦啦卢
  18. centos7部署mysql5.6_Centos7 RPM方式安装部署mysql5.6
  19. 对计算机知识的掌握,计算机操作基本知识
  20. 黄冠|南昌大学计算机科学与技术,课制|这里有全华师最好看的课件

热门文章

  1. 20145214 《Java程序设计》第3周学习总结
  2. GPS坐标转换 百度地图API调用
  3. 弹出窗口里面的子页面控制父页面的解决办法
  4. 先锋展示了可爱鸟形车载机器
  5. php mysql书城_php在线书城 thinkphp源码(含数据库脚本)
  6. JS报错:Uncaught RangeError: Maximum call stack size exceeded
  7. Linux常用命令下,以及再CentOS7下搭建apache网站服务,以及同一服务器上搭建第二个网站
  8. Icon class生成器(Python)
  9. LASSOS方程--图像降噪
  10. DeepMind用ReinforcementLearning玩游戏