循环内部火花RDD过滤器

时间:2017-09-25 22:42:48

标签: scala apache-spark filter rdd

我是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是列表。

但这不起作用。任何建议??

2 个答案:

答案 0 :(得分:2)

你关闭了:for-loop实际上并没有使用它里面计算的值。您应该使用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)
                        }
                    })

答案 1 :(得分:0)

没有yield的理解并没有...好......收益率:) 但是你在这里并不需要理解(或任何&#34;循环&#34;)。

这样的事情:

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

应该这样做。