我有一个看起来像这样的文本文件:
ABC gibberish
DEF gibberish
ABC text
DEF random
我只想保留以 ABC 开头的行。这就是我尝试过的:
val lines = sc.textFile("textfile.txt")
val reg = "^ABC".r
val abc_lines = lines.filter(x => reg.pattern.matcher(x).matches)
abc_lines.count()
计数返回0,所以没有匹配,我哪里出错?
答案 0 :(得分:3)
你不需要正则表达式,你可以只使用startsWith方法。
val abc_lines = lines.filter(x => x.startsWith("ABC"))
答案 1 :(得分:1)
因为方法匹配没有达到预期效果(请参阅文档)。
您可以尝试使用此代码段来理解
val list = List("ABC", "DEF gibberish", "ABC text", "DEF random")
val reg = "^ABC".r
val lines: Seq[String] = list.filter(x => reg.pattern.matcher(x).matches)
println(lines.size)
相反,您可以使用此代码:
val list2 = List("ABC", "DEF gibberish", "ABC text", "DEF random")
val lines2: Seq[String] = list.filter(reg.findFirstIn(_).isDefined)
println(lines2.size)
您可以在此处找到更多信息 - Matching against a regular expression in Scala
答案 2 :(得分:0)
您可以使用 regex 的findFirstIn
方法,如下所示
val abc_lines = lines.filter(x => "^ABC".r.findFirstIn(x) == Some("ABC"))
应该能给你正确的结果。
执行以下操作会在spark中显示Task not serializable
错误消息
val reg = "^ABC".r
val abc_lines = lines.filter(x => reg.findFirstIn(x) == Some("ABC"))