我对正则表达不太满意。我试图将自定义日志行捕获到Hive表中。
到目前为止,我能够使用以下内容捕获基本条目:
CREATE EXTERNAL TABLE IF NOT EXISTS elb_logs_v2_9 (
ResponseCode STRING,
Timestamp STRING,
ResponseTime DOUBLE,
RemoteIP STRING,
URL STRING,
UserAgent STRING,
Referer STRING,
Domain STRING,
Version INT
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (.*) \"(.*)\" \"(.*)\" \"(.*)\" \"(.*)\" (.*)$"
) LOCATION 's3://my-bucket/logfiles/';
这是一个示例日志文件:
204 1434401743 365 XX.XXX.XXX.XXX "/tra.ck?p=1234&a=5432&evt=view&r=1434401750625285" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36" "https://referer.org/page.html" "metric.mydomain.org" 7
204 1434401743 269 XX.XXX.XXX.XXX "/tra.ck?p=1234&a=5432&evt=renderTime&v[]=10&r=1434401750650240" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36" "https://referer.org/page.html" "metric.mydomain.org" 7
基本结构是:
ResponseCode Timestamp ResponseTimeMS RemoteIP QueryString UserAgent Referer Domain Version
如何进一步使用RegEx并从URI中的值创建列?比如说p
和a
值列,以及eventType
来存储view
和renderTime
等?
答案 0 :(得分:0)
如果您可以假设请求始终采用相同格式且参数的顺序正确,那么这将有效。
^([0-9]\d*) ([0-9]\d*) ([0-9]\d*) ([0-9\.X]+) "((?:.*?)p=(\d+)&a=(\d+)&evt=([^&]+).*?)" "([^"]+)" "([^"]+)" "([^"]+)" ([0-9]\d*)$
您可以在此处进行更多编辑和播放:https://regex101.com/r/gS3nO1/2
(编辑)我假设第4项是IP,所以你可以从实际的正则表达式中删除X.