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(2, 3, 4, 4)

scala> rdd1.flatMap(x=>x.to(3)).collect

res11: Array[Int] = Array(1, 2, 3, 2, 3, 3, 3)


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會將一個長度為N的RDD轉換為另一個長度為N的RDD;而flatMap會將一個長度為N的RDD轉換成一個N個元素的集合,然后再把這N個元素合成到一個單個RDD的結果集。

比如一個包含三行內容的數據文件“README.md”。

在spark中map函數和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<-0 until x.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(一條對一條),mapToPair(map成鍵值對),flatMap(一條記錄變n條(n>=0))


Flatmap 和map 區別

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

 

 

 

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

操作1:同map函數一樣:對每一條輸入進行指定的操作,然后為每一條輸入返回一個對象

操作2:最后將所有對象合並為一個對象

通過上圖可以看出,flatMap其實比map多的就是flatten操作。
————————————————
原文鏈接:https://blog.csdn.net/WYpersist/article/details/80220211


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM