spark中map與flatMap的區別

2021-10-09 08:49:45 字數 1508 閱讀 2453

作為spark初學者對,一直對map與flatmap兩個函式比較難以理解,這幾天看了和寫了不少例子,終於把它們搞清楚了

兩者的區別主要在於action後得到的值

例子:

import org.apache.spark.

object mapandflatmap ).foreach(x=>)

arrayrdd.flatmap(string=>).foreach(x=>)

}}

上述**中,列印結果1、2、3分別如下面三圖

列印結果1

列印結果2

列印結果3

對比結果2與結果3,很容易得出結論:

map函式後,rdd的值為 array(array("a","b"),array("c","d"),array("e","f"))

flatmap函式處理後,rdd的值為 array("a","b","c","d","e","f")

即最終可以認為,flatmap會將其返回的陣列全部拆散,然後合成到乙個陣列中

spark中map和flatmap的區別

map會將每一條輸入對映為乙個新物件。.map(去皮) = 其中: 「去皮」函式的型別為:a ⇒ b

2.flatmap包含兩個操作:會將每乙個輸入物件輸入對映為乙個新集合,然後把這些新集合連成乙個大集合。 .flatmap(切碎) = 其中: 「切碎」函式的型別為: a ⇒ list

在使用時map會將乙個長度為n的rdd轉換為另乙個長度為n的rdd;而flatmap會將乙個長度為n的rdd轉換成乙個n個元素的集合,然後再把這n個元素合成到乙個單個rdd的結果集。

比如乙個包含三行內容的資料檔案「readme.md」。

a b c

d

經過以下轉換過程

val textfile = sc.textfile("readme.md")

textfile.flatmap(_.split(" "))

其實就是經歷了以下轉換

["a b c", "", "d"] => [["a","b","c"],,["d"]] => ["a","b","c","d"]
在這個示例中,flatmap就把包含多行資料的rdd,即[「a b c」, 「」, 「d」],轉換為了乙個包含多個單詞的集合。實際上,flatmap相對於map多了的是[[「a」,」b」,」c」],,[「d」]] => [「a」,」b」,」c」,」d」]這一步。

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

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

Spark 中 map 與 flatMap 的區別

通過乙個實驗來看spark 中 map 與 flatmap 的區別。步驟一 將測試資料放到hdfs上面 hadoopdfs put data1 test1.txt tmp test1.txt 該測試資料有兩行文字 步驟二 在spark中建立乙個rdd來讀取hdfs檔案 tmp test1.txt 步...

Spark 中map與 flatMap的區別

進入spark安裝目錄,執行.spark shell 步驟一 將測試資料放到hdfs上面 hadoop dfs put data1 test1.txt tmp test1.txt 該測試資料有兩行文字 該測試資料有兩行文字 步驟二 在spark中建立乙個rdd來讀取hdfs檔案 tmp test1....

Spark 中 map 與 flatMap 的區別

通過乙個實驗來看spark 中 map 與 flatmap 的區別。步驟一 將測試資料放到hdfs上面 hadoopdfs put data1 test1.txt tmp test1.txt 該測試資料有兩行文字 步驟二 在spark中建立乙個rdd來讀取hdfs檔案 tmp test1.txt 步...