我有以下名为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)
答案 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