【问题标题】:Get lines that start with certain characters in Spark在 Spark 中获取以某些字符开头的行
【发布时间】:2017-11-09 14:35:29
【问题描述】:

我有一个如下所示的文本文件:

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

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    您不需要正则表达式,只需使用 startsWith 方法即可。

    val abc_lines = lines.filter(x => x.startsWith("ABC"))
    

    【讨论】:

    • 好的,谢谢!但是你能告诉我我的代码有什么问题吗?
    【解决方案2】:

    因为方法匹配没有达到您的预期(请参阅文档)。

    你可以试试这个sn-p来理解

    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

    【讨论】:

    • 但是,是的,在这种简单的情况下,您不需要正则表达式。
    • 谢谢,这对我也有帮助。
    【解决方案3】:

    您可以使用 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"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      相关资源
      最近更新 更多