Java 如何在scala中解析自定义日志文件以使用模式提取一些键值对
我正在构建一个spark流媒体应用程序,它接收来自服务器的日志。日志行看起来像这样Java 如何在scala中解析自定义日志文件以使用模式提取一些键值对,java,regex,scala,apache-spark,Java,Regex,Scala,Apache Spark,我正在构建一个spark流媒体应用程序,它接收来自服务器的日志。日志行看起来像这样 2015-06-18T13:53:46.606-0400 CustomLog v4 INFO: source="ABCD" type="type1" <xml some xml here attr1='value1' attr2='value2' > </xml> <some more xml></> time ="232" 2015-06-18T13:53:4
2015-06-18T13:53:46.606-0400 CustomLog v4 INFO: source="ABCD" type="type1" <xml some xml here attr1='value1' attr2='value2' > </xml> <some more xml></> time ="232"
2015-06-18T13:53:46.606-0400自定义日志v4信息:source=“ABCD”type=“type1”time=“232”
我正试图遵循databricks在这里编写的示例应用程序
我被ApacheAccessLog.scala中的模式卡住了。我的日志是一个自定义日志,在一个典型的日志行中有这个key=“value”对
我不太明白这个模式意味着什么,以及如何改变它以适应我的应用程序。我需要根据日志中的源键和类型键对时间进行一些聚合case类需要很多东西,比如日志中显然没有的IP地址,因此您需要修改case类定义,以便只包含要添加的字段 为了在这里进行说明,让我们将case类设置为:
case class ApacheAccessLog(source: String, type: String, time: Long)
然后你可以用找到的正则表达式替换正则表达式,你可以在这里玩正则表达式,我准备了一些东西让你开始,产生一个正则表达式,类似这样:
source="(.*?)" type="(.*?)" .* time ="(.*?)"
将三组字符捕获到m
中。然后,您可以使用以下组修复实例化:
ApacheAccessLog(m.group(1), m.group(2), m.group(3).toLong)
HTH.谢谢@bjfletcher我的示例有点过时了,时间在xml之后。。正在尝试做一个quck正则表达式教程。。。我已经很久没有写过任何常规的东西了expressions@Sai不客气,我刚刚在回答中更新了正则表达式,第二次跳过了XML。