Spark中map和flatMap的區別
阿新 • • 發佈:2018-12-18
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));