从Spark中获取以某些字符开头的行

时间:2017-11-09 14:35:30

标签: scala apache-spark

我有一个看起来像这样的文本文件:

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,所以没有匹配,我哪里出错?

3 个答案:

答案 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"))