我是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是列表。
但这不起作用。任何建议??
答案 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)
应该这样做。