map 和 flatMap 的区别

flatMap 和 map 都是 对集合内的元素进行操作的函数,两者的区别主要体现在数据类型和返回结果两方面。

数据类型方面, map 的数据只要是集合就行而 flatMap 则需要包含集合的集合

返回结果方面 map 返回的是一个与处理前集合相对应的集合,原先集合内有多少元素,返回结果内就有多少元素;而 flatMap 则会在原先 map 的基础上再做一步数据扁平化的操作,将集合内的元素拼接成一个字符串

具体见代码示例

先看一下 map 的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def main(args: Array[String]): Unit = {
//创建spark上下文对象
val conf=new SparkConf()
.setMaster("local")
.setAppName("Demo1")
val sc = new SparkContext(conf)

val list = List(1,2,3,4,5)
//将列表序列化
val list_rdd = sc.parallelize(list)
//此处如果使用 flatMap 则会报错
val map = list_rdd.map(x=>x*2)
map.foreach(println(_))
//最后打印的结果为
2
4
6
8
10

再来看一下 flatMap 的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def main(args: Array[String]): Unit = {
//创建spark上下文对象
val conf=new SparkConf()
.setMaster("local")
.setAppName("Demo1")
val sc = new SparkContext(conf)
val list = List(1,2,3,4,5)
val list1 = List(6,7,8,9,10)
val list_rdd = sc.parallelize(list,list1)
val result = list_rdd.flatMap(x=>x)
val result1 = list_rdd.map(x=>x)
result.foreach(print(_))
// 打印结果为
//12345678910
result1.foreach(println(_))
//打印结果为
//List(1, 2, 3, 4, 5)

//List(6, 7, 8, 9, 10)

//如果想要对集合内的元素进行操作,则使用以下方法
val result3 = list_rdd.flatMap(x=>x.map(y=>y*2))
result3.foreach(println)
//打印结果为
//2468101214161820
val result4 = list_rdd.map(x=>x.map(y=>y*2))
result4.foreach(println)
//List(2, 4, 6, 8, 10)
//List(12, 14, 16, 18, 20)

从 result3 和 result4 的相应操作可以看出 map 和 flatMap 的区别就是差一步数据扁平化,如果将 map 的执行结果进行合并就是 flatMap

-----------本文结束感谢您的阅读-----------
0%