为什么Spark RDD不支持“扁平化”

时间:2017-04-10 15:39:43

标签: scala apache-spark rdd higher-order-functions

看一下这个片段[*]:

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. 我是否错过了关于RDD如何工作/应该如何使用的重要观点?
  3. P.S。 我知道我可以使用旧的flatMap来实现我想要的东西

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

1 个答案:

答案 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