在Spark RDD中使用regex从字符串中提取时间戳

问题描述 投票:0回答:1

我有一个日志,如:

[Pipeline] timestamps
[Pipeline] {
[Pipeline] echo
20:33:05 0
[Pipeline] echo

我想在这里只提取time信息(20:33:05)。

我试图做以下事情:

val lines = sc.textFile("/logs/log7.txt")  
val individualLines=lines.flatMap(_.split("\n")) //Splitting file contentinto individual lines
val dates=individualLines.filter(value=>value.startsWith("[0-9]"))

我得到的输出为

MapPartitionsRDD[3] at filter at DateExtract.scala:30

如何在此定义正则表达式?

任何帮助将非常感激。

regex hadoop apache-spark rdd
1个回答
3
投票

如果你有一个包含新行数据的日志文件你没有split它,你可以简单地读取每行是一个String数据

然后通过Character.isDigit检查它是否以数字开头,如下所示

  val lines = sc.textFile("/logs/log7.txt")
  val dates=lines.filter(value=>Character.isDigit(value.charAt(0)))
            .map(_.split(" ")(0))
  dates.foreach(println)

如果你想严格匹配时间戳与正则表达式和过滤器不匹配,那么你可以使用

val dates=lines.filter(value=>Character.isDigit(value.charAt(0)))
    .map(_.split(" ")(0))
    .filter(_.matches("""\d{2}:\d{2}:\d{2}"""))

输出:

20:33:05

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.