为什么 Spark RDD 不支持 "flatten"
Why doesn't Spark RDD support "flatten"
看看这个片段[*]:
val la = List(Array(2, 3, 5), Array(7, 11, 13))
la.flatten
returns
res1: List[Int] = List(2, 3, 5, 7, 11, 13)
现在,我一直在玩 Spark,我偶然发现了一个问题。片段:
val myRdd: RDD[String] = sc.textFile("myFilePath", 10) map (_.split("\n"))
无法编译,因为右侧表达式的类型为 RDD[Array[String]]
就像在 [*] 中一样,我认为扁平化可以解决问题:
val myRdd: RDD[String] = (sc.textFile("myFilePath", 10) map (_.split("\n"))).flatten
但是发现RDD
并没有提供这个操作。我的问题来了:
- RDD 不支持
flatten
的(设计)原因是什么?
- 我是否遗漏了关于如何使用 RDD work/should 的重要观点?
P.S。
我知道我可以用旧的好东西 flatMap
来实现我想要的
val myRdd: RDD[String] = (sc.textFile("myFilePath", 10) map (_.split("\n"))).flatMap(x => x)
您想在这里使用 flatMap 而不是 map。
val myRdd: RDD[String] = sc.textFile("myFilePath", 10) flatMap (_.split("\n"))
此外,textFile 已经按行拆分文件,因此您无需拆分。
Flatten 没有实现,因为它很难实现,您可以使用 flatMap(identity)
来达到同样的效果。因为它无论如何都是多余的,所以不值得努力实施。参见 https://issues.apache.org/jira/browse/SPARK-18855。
看看这个片段[*]:
val la = List(Array(2, 3, 5), Array(7, 11, 13))
la.flatten
returns
res1: List[Int] = List(2, 3, 5, 7, 11, 13)
现在,我一直在玩 Spark,我偶然发现了一个问题。片段:
val myRdd: RDD[String] = sc.textFile("myFilePath", 10) map (_.split("\n"))
无法编译,因为右侧表达式的类型为 RDD[Array[String]]
就像在 [*] 中一样,我认为扁平化可以解决问题:
val myRdd: RDD[String] = (sc.textFile("myFilePath", 10) map (_.split("\n"))).flatten
但是发现RDD
并没有提供这个操作。我的问题来了:
- RDD 不支持
flatten
的(设计)原因是什么? - 我是否遗漏了关于如何使用 RDD work/should 的重要观点?
P.S。
我知道我可以用旧的好东西 flatMap
来实现我想要的
val myRdd: RDD[String] = (sc.textFile("myFilePath", 10) map (_.split("\n"))).flatMap(x => x)
您想在这里使用 flatMap 而不是 map。
val myRdd: RDD[String] = sc.textFile("myFilePath", 10) flatMap (_.split("\n"))
此外,textFile 已经按行拆分文件,因此您无需拆分。
Flatten 没有实现,因为它很难实现,您可以使用 flatMap(identity)
来达到同样的效果。因为它无论如何都是多余的,所以不值得努力实施。参见 https://issues.apache.org/jira/browse/SPARK-18855。