看一下这个片段[*]:
val la = List(Array(2, 3, 5), Array(7, 11, 13))
la.flatten
返回
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
不提供此操作。这是我的问题:
flatten
背后的(设计)原因是什么? P.S。
我知道我可以使用旧的flatMap
来实现我想要的东西
val myRdd: RDD[String] = (sc.textFile("myFilePath", 10) map (_.split("\n"))).flatMap(x => x)
答案 0 :(得分:4)
您想在此处使用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。