1. 程式人生 > >Spark中map和flatMap的區別

Spark中map和flatMap的區別

Map和flatMap的區別

Transformation 含義
map(func) 返回一個新的RDD,該RDD由每一個輸入元素經過func函式轉換後組成
flatMap(func) 類似於map,但是每一個輸入元素可以被對映為0或多個輸出元素(所以func應該返回一個序列,而不是單一元素)

map

map()的返回值型別不需要和輸入型別一樣.這樣如果由一個字串RDD,並且我們的map()函式是用來把字串解析並返回一個Double的值的,那麼此時我們的輸入RDD型別就是 RDD[String],而輸出型別就是 RDD[Double] eg:

//Scala版計算RDD中各值的平方
val input = sc.parallelize(List(1,2,3,4))
val result = input.map(_ * _)
println(result.collect().mkString(","))

flatMap

我們希望對每個輸入元素生成多個輸出元素,實現該功能的操作叫做flatMap(). 和map()類似,我們提供給flatMap()的函式被分別應用到了輸入RDD的每個元素上.不過返回的不是一個元素,而是一個返回值序列的迭代器. eg:

//Scala中的flatMap()將行資料切分為單詞
val lines = sc.parallelize(List("hello world","hi"))
val words= lines.flatMap(_.split(" "))
words.first() 
//返回"hello"

引用Saprk快速大資料分析-P31 flatMap就是將原來RDD中的每一個元素通過函式func轉換為新的函式,並將生成的新的RDD的每個集合中的元素合併為一個集合,內部實現了一個FlatMappedRDD(this , sc.clean(func));