Regex 如何在spark scala中正确解析apache日志文件?

Regex 如何在spark scala中正确解析apache日志文件?,regex,scala,apache-spark,apache-spark-sql,Regex,Scala,Apache Spark,Apache Spark Sql,我试图读取apache日志文件,并试图在解析后将其放入数据帧 首先,我获取了日志的一行示例,并使用正则表达式进行了一些练习来解析相同的内容。但是,当我尝试在代码中实现相同的内容时,它会说“未找到匹配项”,即使它在演示中正常工作。请帮助 目前,它表示未找到匹配项并出错。我希望分别查看每个解析的字符串,最后我希望将其应用于整个文件,以便在未找到匹配项时也可以处理异常。您必须在val matcher=p.matcher(logLine)之后运行matcher.matches例如,谢谢@Thefour

我试图读取apache日志文件,并试图在解析后将其放入数据帧

首先,我获取了日志的一行示例,并使用正则表达式进行了一些练习来解析相同的内容。但是,当我尝试在代码中实现相同的内容时,它会说“未找到匹配项”,即使它在演示中正常工作。请帮助


目前,它表示未找到匹配项并出错。我希望分别查看每个解析的字符串,最后我希望将其应用于整个文件,以便在未找到匹配项时也可以处理异常。

您必须在
val matcher=p.matcher(logLine)之后运行
matcher.matches
例如,谢谢@Thefourthbird。明白了。我现在正试图用单列(这是完整的字符串)在dataframe上对其进行泛化。我想将其拆分为多列以进行进一步分析。我使用
val logFile=sqlContext.read.text(“file:///C:/Users/xxx/Downloads/logs//test.log")val split_df=logFile.withColumn(“host”,regexp_extract(logFile(“value”),raw“^([^\s]+\s)”,1))
但我想在完整数据帧的问题中应用正则表达式,并从中获得多个列。如果某个模式不匹配,0应该会来。我是scala的新手。有人能帮忙吗?您必须在
val matcher=p.matcher(logLine)之后运行
matcher.matches
例如,谢谢@Thefourthbird。明白了。我现在正试图用单列(这是完整的字符串)在dataframe上对其进行泛化。我想将其拆分为多列以进行进一步分析。我使用
val logFile=sqlContext.read.text(“file:///C:/Users/xxx/Downloads/logs//test.log")val split_df=logFile.withColumn(“host”,regexp_extract(logFile(“value”),raw“^([^\s]+\s)”,1))
但我想在完整数据帧的问题中应用正则表达式,并从中获得多个列。如果某个地方的模式不匹配,应该是0。我是scala的新手。有人能帮忙吗?
package common

object loganalysis extends App {

  import common._
  import org.apache.spark.sql.functions._
  import java.util.regex.Pattern
  import java.util.regex.Matcher
  import scala.util.{Try, Success, Failure}

  val spSession = SparkCommonUtils.spSession
  val spContext = SparkCommonUtils.spContext

  import spSession.implicits._

  val sqlContext = new org.apache.spark.sql.SQLContext(spContext)

  val regex = """(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})? (\S+) (\S+) (\[.+?\]) \"(.*?)\" (\d{3}) (\S+) \"(.*?)\" \"(.*?)\""""

  val p = Pattern.compile(regex)

  val logLine = s"""94.102.63.11 - - [21/Jul/2009:02:48:13 -0700] "GET / HTTP/1.1" 200 18209 "http://acme.com/foo.php" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)""""

  val matcher = p.matcher(logLine)

  println(matcher.group(1))

  }