2017-06-25 65 views
1

我想了解map和flatMap是如何工作的,但是卡在下面的一段代碼中。 flatMap()函數返回一個RDD [Char],但我期待的是RDD [String]。 有人可以解釋爲什麼它產生RDD [Char]?flatMap()函數返回RDD [Char]代替RDD [String]

scala> val inputRDD = sc.parallelize(Array(Array("This is Spark"), Array("It is a processing language"),Array("Very fast"),Array("Memory operations"))) 

scala> val mapRDD = inputRDD.map(x => x(0)) 
mapRDD: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[28] at map at <console>:26 

scala> mapRDD.collect 
res27: Array[String] = Array(This is Spark, It is a processing language, Very fast, Memory operations) 

scala> val mapRDD = inputRDD.flatMap(x => x(0)) 
mapRDD: org.apache.spark.rdd.RDD[Char] = MapPartitionsRDD[29] at flatMap at <console>:26 

scala> mapRDD.collect 
res28: Array[Char] = Array(T, h, i, s, , i, s, , S, p, a, r, k, I, t, , i, s, , a, , p, r, o, c, e, s, s, i, n, g, , l, a, n, g, u, a, g, e, V, e, r, y, , f, a, s, t, M, e, m, o, r, y, , o, p, e, r, a, t, i, o, n, s) 
+0

可能的重複[有人可以向我解釋地圖和flatMap之間的區別,什麼是每個好的用例?](https://stackoverflow.com/questions/22350722/can-someone-explain-to- me-the-difference-between-map-and-flatmap-and-what-is-ag) –

回答

2

看看這個答案:https://stackoverflow.com/a/22510434/1547734

基本上flatmap將N個元素的RDD到(邏輯)的N集合的RDD,然後變平入內部集合中的所有元素的RDD 。

所以,當你做inputRDD.flatMap(x => x(0))時,你將每個元素轉換成一個字符串。字符串是字符的集合,所以「扁平」部分會將整個RDD轉換爲結果字符的RDD。

由於RDD基於scala集合,因此以下http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/可能有助於更好地理解它。

+0

謝謝阿薩夫。它真的清除了我的懷疑。 – Rahul

1

flatMap的目標是將單個項目轉換爲多個項目(即一對多關係)。例如,對於RDD[Order],其中每個訂單可能有多個項目,我可以使用flatMap來獲得RDD[Item](而不是RDD[Seq[Item]])。

就你而言,String實際上是Seq[Char]。因此,它假定你想要做的就是取一個字符串並將其分解爲其組成字符。

現在,如果你想要的是用flatMap讓所有的原料String在你RDD的,你flatMap功能也許應該是這樣的:x => x

相關問題