我试图理解map和flatMap是如何工作的,但是却陷入了下面的代码片段。 flatMap()函数返回一个RDD [Char],但我期待RDD [String]。 有人能解释为什么它会产生RDD [Char]吗?
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 :(得分:2)
看一下这个答案:https://stackoverflow.com/a/22510434/1547734
基本上flatmap将N个元素的RDD转换为(逻辑上)N个集合的RDD,然后将其展平为内部集合的所有ELEMENTS的RDD。
因此,当您输入RDD.flatMap(x =&gt; x(0))时,您将每个元素转换为字符串。字符串是一个字符集合,因此“展平”部分会将整个RDD转换为结果字符的RDD。
由于RDD基于scala集合,因此以下http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/可能有助于更好地理解它。
答案 1 :(得分:1)
flatMap
的目标是将单个项目转换为多个项目(即一对多关系)。例如,对于RDD[Order]
,每个订单可能包含多个项目,我可以使用flatMap
获取RDD[Item]
(而不是RDD[Seq[Item]]
)。
在您的情况下,String
实际上是Seq[Char]
。因此,它假定你想要做的是取一个字符串并将其分解为其组成字符。
现在,如果您想要使用flatMap
来获取RDD中的所有原始String
,那么您的flatMap
函数应该如下所示:{{1} }。