map和flatmap区别
两者的区别主要在于action后得到的值
map将函数作用到数据集的每一个元素上,生成一个新的分布式的数据集(RDD)返回
flatMap会先执行map的操作,再将所有对象合并成一个对象,返回值是一个序列(Sequence)
例子:
object Test2 {
def main(args: Array[String]): Unit = {
val sc = new SparkContext(new SparkConf().setMaster("local").setAppName("Test2"))
val strings: Array[String] = Array("a_b","c_d","e_f")
val data: RDD[String] = sc.parallelize(strings)
data.foreach(println) //第一次打印结果
data.map(s=>{
s.split("_")
}).foreach(x=>{
println(x.mkString(",")) //第二次打印结果
})
data.flatMap(s=>{
s.split("_")
}).foreach(x=>{
println(x.mkString(",")) //第三次打印结果
})
}
}
上处代码中,打印结果1、2、3分别如下面三图
打印结果1:
打印结果2:
打印结果3:
注:对比结果2和结果3,得出结论:
map函数处理后,RDD的值为 Array(Array("a","b"), Array("c","d"), Array("e","f"))
flatMap函数处理后,RDD值为 Array("a","b","c","d","e","f")
所以最终认为,flatMap会将其返回的数组全部打散,然后再合成到一个数组中