1. 程式人生 > >spark中map和flatmap之間的區別

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】