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