最新消息: 关于Git&GitHub 版本控制你了解多少?
您现在的位置是:群英 > 服务器 > 云计算 >
浅析scala中map与flatMap的区别
CSDN发表于 2020-09-04 15:57 次浏览

任何一种函数式语言中,都有map函数与faltMap这两个函数,比如python虽然不是纯函数式语言,也有这两个函数。再比如在jdk1.8之后,也加入了Lambda表达式,自然也支持map函数。

现在简单说说scala中这两个函数的用法。


函数原型

1.map(func)

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

2.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).)

 

使用说明

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

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


  1. a b c
  2.  
     
  3. d

经过以下转换过程


  1. val textFile = sc.textFile("README.md")
  2. textFile.flatMap(_.split(" "))

其实就是经历了以下转换

["a b c", "", "d"] => [["a","b","c"],[],["d"]] => ["a","b","c","d"]

在这个示例中,flatMap就把包含多行数据的RDD,即[“a b c”, “”, “d”] ,转换为了一个包含多个单词的集合。实际上,flatMap相对于map多了的是[[“a”,”b”,”c”],[],[“d”]] => [“a”,”b”,”c”,”d”]这一步。


区别对比

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

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


示例验证

接下来,我们用一个例子来进行比较,首先在HDFS里写入了这样内容的一个文件:


  1. C:\WINDOWS\system32>hadoop fs -cat hdfs://localhost:9000/user/input/wordcount.txt
  2.  
    word in text
  3.  
    hello spark
  4.  
    the third line
  5.  
    C:\WINDOWS\system32>

然后再spark里进行测试,如下


  1. scala> var textFile =sc.textFile("hdfs://localhost:9000/user/input/wordcount.txt")
  2. textFile: org.apache.spark.rdd.RDD[String] = hdfs://localhost:9000/user/input/wordcount.txt MapPartitionsRDD[1] at textFile at <console>:27

map的结果


  1. scala> var mapResult = textFile.map(line => line.split("\\s+"))
  2. mapResult: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[2] at map at <console>:29
  3.  
     
  4. scala> mapResult.collect
  5. res0: Array[Array[String]] = Array(Array(word, in, text), Array(hello, spark), Array(the, third, line))

flatMap的结果


  1. scala> var flatMapResult = textFile.flatMap(line => line.split("\\s+"))
  2. flatMapResult: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at flatMap at <console>:29
  3.  
     
  4. scala> flatMapResult.collect
  5. res1: Array[String] = Array(word, in, text, hello, spark, the, third, line)
     

 

标签:scala与flatMa
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
相关信息推荐