【问题标题】:Why doesn't Spark RDD support "flatten"为什么 Spark RDD 不支持“扁平化”
【发布时间】:2017-04-12 17:18:22
【问题描述】:

看看这个sn-p [*]:

val la = List(Array(2, 3, 5), Array(7, 11, 13))
la.flatten

返回

res1: List[Int] = List(2, 3, 5, 7, 11, 13)

现在,我一直在玩 Spark,但偶然发现了一个问题。 sn-p:

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 如何工作/应该使用的重要一点?

附: 我知道我可以使用旧好的flatMap 来实现我想要的

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

【问题讨论】:

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


    【解决方案1】:

    您想在这里使用 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

    【讨论】:

    • 谢谢!很棒的评论。这个问题回答了我的问题。尽管如此,我仍然不相信,如果flatten 是多余的,为什么scala 自己提供它?我认为应该提供它,因为其他高阶函数是。
    • @GA1 Scala 集合和 Spark 是由不同的团队以不同的想法制作的,RDD 与常规集合有很大不同。如果您阅读了相关问题并链接了拉取请求,您会看到已经尝试过,但是根据开发人员的说法,这将很难实现,并且他们认为由于 flatmap 证明了相同的功能而没有任何真正的好处,所以他们会而是将资源花在更有影响力的事情上。
    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2023-04-07
    • 2021-10-01
    • 2016-11-09
    • 2014-09-30
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多