1. 程式人生 > >spark RDD 的map與flatmap區別說明

spark RDD 的map與flatmap區別說明

HDFS到HDFS過程

看看map flatmap的位置


Flatmap map 的定義 

map()是將函式用於RDD中的每個元素,將返回值構成新的RDD。

flatmap()是將函式應用於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).collect

res10: Array[Int] = Array(2344)

scala> rdd1.flatMap(x=>x.to(

3)).collect

res11: Array[Int] = Array(1232333)

map(func)

將原資料的每個元素傳給函式func進行格式化,返回一個新的分散式資料集。(原文:Return a new distributed dataset formed by passing each element of the source through a function func.)

flatMap(func)

map(func)類似,但是每個輸入項和成為0個或多個輸出項(所以func函式應該返回的是一個序列化的資料而不是單個數據項)(原文:Similar to map, but each input item can be mapped to 0 or more output items (so func should return a Seq rather than a single item).)

Flatmap map 使用說明

在使用時map會將一個長度為NRDD轉換為另一個長度為NRDD;而flatMap會將一個長度為NRDD轉換成一個N個元素的集合,然後再把這N個元素合成到一個單個RDD的結果集。

比如一個包含三行內容的資料檔案README.md”。

sparkmap函式和flatMap函式是兩個比較常用的函式。其中
map:對集合中每個元素進行操作。flatMap:對集合中每個元素進行操作然後再扁平化。 

例如:

val arr=sc.parallelize(Array(("A",1),("B",2),("C",3))) arr.flatmap(x=>(x._1+x._2)).foreach(println)

輸出結果為

A1

B2

C3

如果用map

val arr=sc.parallelize(Array(("A",1),("B",2),("C",3)))

arr.map(x=>(x._1+x._2)).foreach(println)

輸出結果

A1

B2

C3

所以flatMap扁平化意思大概就是先用了一次map之後對全部資料再一次map

Flatmap map 實際使用場景

有一個場景,在字串中如何統計相鄰字元對出現的次數。意思就是如果有A;B;C;D;B;C字串,則(A,B),(C,D),(D,B)相鄰字元對出現一次,(B,C)出現兩次。 如有資料

A;B;C;D;B;D;C

B;D;A;E;D;C

A;B

統計相鄰字元對出現次數程式碼如下

data.map(_.split(";")).flatMap(x=>{

for(i<-0untilx.length-1) yield (x(i)+","+x(i+1),1)

    }).reduceByKey(_+_).foreach(println)

輸出結果為

(A,E,1)(E,D,1)(D,A,1)(C,D,1)(B,C,1)(B,D,2)(D,C,2)(D,B,1)(A,B,2)

map操作我記得的有map(一條對一條),mapToPairmap成鍵值對),flatMap(一條記錄變n條(n>=0))

Flatmap map 區別

map(func)函式會對每一條輸入進行指定的func操作,然後為每一條輸入返回一個物件;而flatMap(func)也會對每一條輸入進行執行的func操作,然後每一條輸入返回一個相對,但是最後會將所有的物件再合成為一個物件;從返回的結果的數量上來講,map返回的資料物件的個數和原來的輸入資料是相同的,而flatMap返回的個數則是不同的。

 

map函式會對每一條輸入進行指定的操作,然後為每一條輸入返回一個物件;而flatMap函式則是兩個操作的集合——正是“先對映後扁平化”:

操作1:同map函式一樣:對每一條輸入進行指定的操作,然後為每一條輸入返回一個物件

操作2:最後將所有物件合併為一個物件

通過上圖可以看出,flatMap其實比map多的就是flatten操作。