EMR Hive Regex QueryString值

时间:2015-06-16 00:58:10

标签: sql regex hadoop

我对正则表达不太满意。我试图将自定义日志行捕获到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中的值创建列?比如说pa值列,以及eventType来存储viewrenderTime等?

1 个答案:

答案 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.