【问题标题】:loop inside spark RDD filter火花 RDD 过滤器内的循环
【发布时间】:2018-03-07 00:21:51
【问题描述】:

我是 Spark 的新手,正在尝试在 scala 中编写代码。我有一个 RDD,其中包含以下形式的数据:

1: 2 3 5
2:5 6 7
3:1 8 9
4:1 2 4

还有一个 [1,4,8,9] 形式的列表

我需要过滤 RDD,使其包含列表中存在 ':' 之前的值或列表中存在 ':' 之后的任何值的那些行。

我写了以下代码:

val links = linksFile.filter(t => {
                        val l = t.split(": ")
                        root.contains(l(0).toInt) ||
                        for(x<-l(0).split(" ")){
                            root.contains(x.toInt)
                        }
                    })

linksFile 是 RDD,root 是列表。

但这不起作用。有什么建议吗??

【问题讨论】:

    标签: scala apache-spark filter rdd


    【解决方案1】:

    你已经接近了:for循环实际上并没有使用它内部计算的值。您应该改用exists 方法。另外我认为您想要l(1),而不是l(0) 进行第二次检查:

    val links = linksFile.filter(t => {
                            val l = t.split(": ")
                            root.contains(l(0).toInt) ||
                            l(1).split(" ").exists { x =>
                                root.contains(x.toInt)
                            }
                        })
    

    【讨论】:

      【解决方案2】:

      没有yield 的理解不会......好吧......产量:) 但是您在这里并不需要真正的理解(或任何“循环”)。

      类似这样的:

      linksFile.map(
         _.split(": ").map(_.toInt)
       ).filter(_.exits(list.toSet))
        .map(_.mkString)
      

      应该这样做。

      【讨论】:

        猜你喜欢
        • 2015-07-10
        • 2018-09-18
        • 1970-01-01
        • 1970-01-01
        • 2021-04-04
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 2018-12-17
        相关资源
        最近更新 更多