2017-04-10 56 views
2

看一看这个片段[*]:为什么不星火RDD支持 “扁平化”

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不提供此操作。这里来我的问题:

  1. RDD背后的原因是什么(设计)不支持flatten
  2. 就是我失踪RDDS如何工作的一个重要点/应使用?

P.S. 我知道我可以只使用旧的好flatMap达到我想要的

val myRdd: RDD[String] = (sc.textFile("myFilePath", 10) map (_.split("\n"))).flatMap(x => x) 

回答

4

你想在这里改用地图flatMap。

val myRdd: RDD[String] = sc.textFile("myFilePath", 10) flatMap (_.split("\n")) 

另外textFile已经将文件按行分割,所以你的分割是不必要的。

展平并没有得到执行,因为这将是难以实现,你可以只使用flatMap(identity)达到同样的效果。由于无论如何这将是多余的,不值得付诸实施。见https://issues.apache.org/jira/browse/SPARK-18855

+0

THX!好的言论。这个问题回答了我的问题。不过,我不相信,为什么'scala'自己提供它,如果'flatten'是多余的?我认为应该提供,因为其他更高级的功能。 – GA1

+0

@ GA1 Scala集合和火花是由不同的团队有不同的想法进行的,而且是RDD从定期收集有点不同。如果你阅读相关的问题和拉链请求,你会发现它已经被尝试过了,但根据开发者的说法,这将很难实现,他们认为没有任何实际的好处,因为flatmap证明了相同的功能,所以他们会宁愿将资源花在更有影响力的东西上。 – puhlen