日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spark RDD 的map与flatmap区别说明(转)

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spark RDD 的map与flatmap区别说明(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載前備注:
下面的實驗全部在spark-shell中運行即可
#-------------------------------------------------------------------------
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,再來看個例子

scala>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)出現兩次。

統計相鄰字符對出現次數代碼如下

scala> val data="A;B;C;D;B;D;C;B;D;A;E;D;C;A;B" scala> val data_rdd=sc.parallelize(List(data)) scala> data_rdd.map(_.split(";")).flatMap(x=>{ for(i<-0 until x.length-1) yield (x(i)+","+x(i+1),1) }).reduceByKey(_+_).foreach(println)

輸出結果為

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

其中
+

表示任選兩個不重疊的相鄰的元素
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操作。

總結

以上是生活随笔為你收集整理的spark RDD 的map与flatmap区别说明(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。