spark 的 map 和 flatMap 应该怎样理解

2025-01-07 00:21:55
推荐回答(3个)
回答1:

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

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

flatmap()是将函数应用于RDD中的每个元素,将返回的迭代器的所有内容构成新的RDD,这样就得到了一个由各列表中的元素组成的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,再来看个例子

val rdd1 = sc.parallelize(List(1,2,3,3))
scala> rdd1.map(x=>x+1).collectres10: Array[Int] = Array(2, 3, 4, 4)
scala> rdd1.flatMap(x=>x.to(3)).collectres11: Array[Int] = Array(1, 2, 3, 2, 3, 3, 3)

回答2:

map: 对RDD每个元素转换
flatMap: 对RDD每个元素转换, 然后再扁平化(即将所有对象合并为一个对象)
e.g.
// data 有两行数据,第一行 a,b,c,第二行1,2,3
scala>data.map(line1 => line1.split(",")).collect()
res11: Array[Array[String]] = Array(Array(a, b, c),Array(1, 2, 3))
scala>data.flatMap(line1 => line1.split(",")).collect()
res13: Array[String] = Array(a, b, c, 1, 2, 3)

回答3:


scala> val rdd = sc.parallelize(List("coffee panda","happy panda","happiest panda party"))
rdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at parallelize at :24

scala> rdd.flatMap(x=>x.split(" ")).collect
res0: Array[String] = Array(coffee, panda, happy, panda, happiest, panda, party)

scala> rdd.map(x=>x.split(" ")).collect
res1: Array[Array[String]] = Array(Array(coffee, panda), Array(happy, panda), Array(happiest, panda, party))

大数据系统相关资料欢迎浏览网页链接