spark RDD 的map与flatmap区别说明(转)
转载前备注:
下面的实验全部在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区别说明(转)相关推荐
- map and flatmap 区别
2019独角兽企业重金招聘Python工程师标准>>> map vs flatMap in Spark September 24, 2014Big Dataexample, spar ...
- java8中的map与flatmap区别
map:只能返回一个值 flatmap:返回多个值 new ArrayList().stream().map(x -> x);//返回一个 new ArrayList().stream().fl ...
- java8 flatmap与map_java8中map和flatMap区别
1.函数定义比较 map注释: /** * Returns a stream consisting of the results of applying the given * function to ...
- map 和 flatMap 区别
区别 这两个在本质上是一样的,都是 map 操作,即对流形式的传入数据进行处理返回一个数据.但是区别方面从字面上就可以体现出来,flatMap 比 map 多了一个 flat 操作,也就是 " ...
- Spark RDD API:Map和Reduce
参考文章: http://blog.csdn.net/jewes/article/details/39896301 http://homepage.cs.latrobe.edu.au/zhe/Zhen ...
- Spark RDD API详解(一) Map和Reduce
来源:http://blog.csdn.net/jewes/article/details/39896301 本文由cmd markdown编辑,原始链接:https://www.zybuluo.co ...
- Spark中 RDD之coalesce与repartition区别
Spark中 RDD之coalesce与repartition区别 coalesce def coalesce(numPartitions: Int, shuffle: Boolean = false ...
- Stream中map和flatmap的区别,一看就懂
在日常开发中,我们经常会使用Stream来处理集合的操作. 其中,map是我们经常用到的api方法,同时呢,Stream也给我们提供了flatmap的方法. 这时候很多小伙伴就会搞不懂,这map和fl ...
- Spark学习之Spark RDD算子
个人主页zicesun.com 这里,从源码的角度总结一下Spark RDD算子的用法. 单值型Transformation算子 map /*** Return a new RDD by applyi ...
最新文章
- 华为存储iscsi配置_iscsi 华为存储配置 上课内容
- CYQ.Data 轻量数据层之路 使用篇三曲 MAction 取值赋值(十四)
- 华人计算机大牛刘炯朗教授仙逝,他是姚期智院士的博士导师,还著有离散数学教科书...
- 《那些年啊,那些事——一个程序员的奋斗史15》
- sqlserver的基本介绍
- Deeplearnng.AI第四部分第二周、经典网络
- java I/O系统总结
- Gateway网关-过滤器链执行顺序
- iOS 开发和部署过程概述
- 打开WORD 2003时提示发现错误,需要关闭,还要发送错误报告给Microsoft 解决方案...
- Android SDK环境变量配置(windows和Linux)
- Linux并非无毒 十五年病毒简史
- EMC RS485接口EMC电路设计方案
- .mdf数据库恢复mysql_只有mdf文件和ldf文件,怎么恢复数据库。
- Java程序设计 试卷A
- 专利检索及分析模拟登陆(python)
- HDU1087 噜啦啦卢
- centos7部署mysql5.6_Centos7 RPM方式安装部署mysql5.6
- 对计算机知识的掌握,计算机操作基本知识
- 黄冠|南昌大学计算机科学与技术,课制|这里有全华师最好看的课件
热门文章
- 20145214 《Java程序设计》第3周学习总结
- GPS坐标转换 百度地图API调用
- 弹出窗口里面的子页面控制父页面的解决办法
- 先锋展示了可爱鸟形车载机器
- php mysql书城_php在线书城 thinkphp源码(含数据库脚本)
- JS报错:Uncaught RangeError: Maximum call stack size exceeded
- Linux常用命令下,以及再CentOS7下搭建apache网站服务,以及同一服务器上搭建第二个网站
- Icon class生成器(Python)
- LASSOS方程--图像降噪
- DeepMind用ReinforcementLearning玩游戏