Scala - 如果存在字符串/单词,则过滤文档中的行

时间:2017-04-10 09:38:35

标签: scala filter

我有以下名为weblogs.txt的文件:

56.38.234.188 – 99788 "GET /KBDOC-00157.html HTTP/1.0" …
56.38.234.188 – 99788 "GET /theme.css HTTP/1.0" …
203.146.17.59 – 25254 "GET /KBDOC-00230.html HTTP/1.0" …
221.78.60.155 – 45402 "GET /titanic_4000_sales.html HTTP/1.0" …
65.187.255.81 – 14242 "GET /KBDOC-00107.html HTTP/1.0"

我想过滤掉所有字词:“KBDOC”

这是我到目前为止所写的内容,但没有结果:

val patt = "KBDOC".r
val kbreqs = sc.textFile("weblogs.txt").filter(line => line.contains(patt))
kbreqs.foreach(println)

但这打印没什么。我做错了什么?

预期结果:

56.38.234.188 – 99788 "GET /KBDOC-00157.html HTTP/1.0" …
203.146.17.59 – 25254 "GET /KBDOC-00230.html HTTP/1.0" …
65.187.255.81 – 14242 "GET /KBDOC-00107.html HTTP/1.0"

根据解决方案进行编辑[已解决]:

val patt: String = "KBDOC"
val kbreqs = sc.textFile("weblogs.txt").filter(line => line.contains(patt)).collect()
kbreqs.foreach(println)

2 个答案:

答案 0 :(得分:2)

您可以使用String代替Regex

val patt: String = "KBDOC"
val kbreqs = sc.textFile("weblogs.txt").filter(line => line.contains(patt))

或者,如果您想使用Regex

val patt: String = ".*KBDOC.*"
val kbreqs = sc.textFile("weblogs.txt").filter(line => line.matches(patt))

另一个版本:

val patt: Regex = "KBDOC".r
val kbreqs = sc.textFile("weblogs.txt").filter(line => patt.findAllIn(line).length > 0)

答案 1 :(得分:2)

首先,您要将正则表达式与一个期望String作为参数的方法混合。

contains的{​​{1}}和matches方法都将另一个String作为参数,然后转换为正则表达式,最后与字符串本身匹配。

因此,您可以使用以下任何一种

String