我很难用pyspark将日志文件拆分为可能包含多行事件的数据帧。这些事件正是我需要帮助的
日志文件的格式为
2020-04-03T14:12:24,368 DEBUG [main] blabla bla bla bla
2020-04-03T14:12:24,371 DEBUG [main] bla bla bla bla
2020-04-03T14:12:24,348 DEBUG [Thread-2] multiline log line bla bla
bla bla bla
bla bla
blablabla
2020-04-03T14:12:24,377 DEBUG [main] blabla bla bla bla
要将一行拆分为多个组,我只需使用
log_pattern = r'(\d*-\d*-\d*)T(\d*:\d*:\d*,\d*)[ ]{1,}(DEBUG|INFO|WARN|FATAL|ERROR|TRACE)[ ]{1,}(\[.*\])[ ]{1,}(.*)'
logs_df = base_df.select(regexp_extract('value', log_pattern, 1).alias('date'),
regexp_extract('value', log_pattern, 2).alias('timestamp'),
regexp_extract('value', log_pattern, 3).alias('log_level'),
regexp_extract('value', log_pattern, 4).alias('application'),
regexp_extract('value', log_pattern, 5).alias('log_content'))
logs_df.show(10, truncate=True)
输出:
+----------+------------+---------+-----------+--------------------+
| date| timestamp|log_level|application| log_content|
+----------+------------+---------+-----------+--------------------+
|2020-04-08|00:35:12,014| INFO| [main]|Log4J2Helper:68 -...|
|2020-04-08|00:35:12,014| INFO| [main]|Log4J2Helper:69 -...|
....
我想要的是log_content
包含多行日志事件。然而,我不明白我应该如何根据多行注释分割行。我已经尝试过拆分,regexp lookahead,但似乎没有得到正确的结果
spark.read.tex
似乎具有自定义新行分隔符的选项,但它不能接受regexp
我想先使用re模块进行解析,但由于日志文件的大小只有千兆字节,我可能会遇到内存和处理问题
有人能告诉我应该如何处理这些大型多行日志文件吗
您可以在最后一个组
(.*(?:\r?\n(?!\d+-).*)*)
中使用负前瞻来捕获以下所有不以1个或多个数字和连字符开头的行请注意,如果使用
\d*-\d*-\d*
,还可以匹配,因为量词
*
匹配0次或更多次这部分
\[.*\]
可以使用否定字符类\[[^][]*\]
来编写,以防止过度匹配并使其性能更高Regex demo
相关问题 更多 >
编程相关推荐