天天看點

flatmap和map的差別(以Spark的WordCount為例)

/* wordcount.txt
張三 李四
王五 趙六
張三
張三
*/
val rdd = sc.textFile("wordcount.txt")
                   .flatMap(x=>x.split(" "))
                   .map(x=>(x,1))
                   .reduceByKey(_+_)
           

注意:flatmap與map的先後順序(先flatmap後map)

否則:報錯 Cannot use map-sidecombining with array keys

疑惑:可以看先用了flatmap,然後再用的map。那這之間有什麼差別呢?

原因分析:

    1、行與行之間的分隔符也是 " "

    2、flatmap是将整個檔案的單詞整合起來成為一個list;map是将每一行的單詞整合起來成為一個list 。

差別對比:

1. map(func)函數會對每一條輸入進行指定的func操作,然後為每一條輸入傳回一個對象;

2. 而flatMap(func)也會對每一條輸入進行執行的func操作,然後每一條輸入傳回一個對象,但是最後會将所有的對象再合成為一個對象;

3. 從傳回的結果的數量上來講,map傳回的資料對象的個數和原來的輸入資料是相同的,而flatMap傳回的個數則是不同的。

請參考下圖進行了解:

flatmap和map的差別(以Spark的WordCount為例)

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

繼續閱讀