【发布时间】:2013-07-29 21:38:48
【问题描述】:
我正在寻找一个正则表达式,它可以以
的形式提供给 Hive QL 的“创建外部表”语句"input.regex"="the regex goes here"
条件是RegexSerDe必须读取的文件中的日志格式如下:
2013-02-12 12:03:22,323 [DEBUG] 2636hd3e-432g-dfg3-dwq3-y4dsfq3ew91b Some message that can contain any special character, including linebreaks. This one does not have a linebreak. It just has spaces on the same line.
2013-02-12 12:03:24,527 [DEBUG] 265y7d3e-432g-dfg3-dwq3-y4dsfq3ew91b Some other message that can contain any special character, including linebreaks. This one does not have one either. It just has spaces on the same line.
2013-02-12 12:03:24,946 [ERROR] 261rtd3e-432g-dfg3-dwq3-y4dsfq3ew91b Some message that can contain any special character, including linebreaks.
This is a special one.
This has a message that is multi-lined.
This is line number 4 of the same log.
Line 5.
2013-02-12 12:03:24,988 [INFO] 2632323e-432g-dfg3-dwq3-y4dsfq3ew91b Another 1-line log
2013-02-12 12:03:25,121 [DEBUG] 263tgd3e-432g-dfg3-dwq3-y4dsfq3ew91b Yet another one line log.
我正在使用以下创建外部表代码:
CREATE EXTERNAL TABLE applogs (logdatetime STRING, logtype STRING, requestid STRING, verbosedata STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES
(
"input.regex" = "(\\A[[0-9:-] ]{19},[0-9]{3}) (\\[[A-Z]*\\]) ([0-9a-z-]*) (.*)?(?=(?:\\A[[0-9:-] ]{19},[0-9]|\\z))",
"output.format.string" = "%1$s \\[%2$s\\] %3$s %4$s"
)
STORED AS TEXTFILE
LOCATION 'hdfs:///logs-application';
事情是这样的:
它能够提取每个日志的所有 FIRST LINES。但不是其他多行的日志行。我尝试了所有链接,最后将\z 替换为\Z,将\A 替换为^ 和\Z 或\z 与$,没有任何效果。我在 output.format.string 的%4$s 中遗漏了什么吗?还是我没有正确使用正则表达式?
正则表达式的作用:
它首先匹配时间戳,然后是日志类型(DEBUG 或 INFO 或其他),然后是 ID(小写字母、数字和连字符的混合),然后是 ANYTHING,直到下一个时间戳找到,或者直到输入的末尾找到匹配最后一个日志条目。我还尝试在末尾添加/m,在这种情况下,生成的表具有所有 NULL 值。
【问题讨论】:
-
你为什么不把那个宝贝排列起来呢? (哈哈,这甚至不是一个动词,但仍然......你不能将它们中的每一个都设置为一个数组吗?那么第一行将是键 0,第二个多行项目将在 1 中,另外两个在 2 和 3并且您可以随意调用它们)