spark中map和flatmap之間的區別
map()是將函式用於RDD中的每個元素,將返回值構成新的RDD。
flatmap()是將函式應用於RDD中的每個元素,將返回的迭代器的所有內容構成新的RDD,這樣就得到了一個由各列表中的元素組成的RDD,而不是一個列表組成的RDD。
有些拗口,看看例子就明白了。
val rdd = sc.parallelize(List("coffeepanda","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).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)
點到為止版:flatMap = flatten + map;
深坑版: 就是自函子範疇上的一個協變函子的態射函式與自然變換的組合!
var li=List(1,2,3,4)
var res =li.flatMap(x=> x match {
case 3=> List(3.1,3.2)
case _=>List(x*2)
})
println(res)
li= List(1,2,3,4)
var res2 =li.map(x=> x match {
case 3=>List(3.1,3.2)
case _=>x*2
})
println(res2)
//output=>
List(2,4, 3.1,3.2, 8)
List(2,4, List(3.1,3.2), 8)
Program exited.
這個過程就像是先map, 然後再將 map 出來的這些列表首尾相接 (flatten).
【本文非博主原創,原文連結:http://blog.csdn.net/u013063153/article/details/53304087】