用于访问hive serde的登录的正则表达式

时间:2012-02-01 19:44:51

标签: regex hive

我想从访问日志中提取(ip,requestUrl,timeStamp)以加载到hive数据库。访问日志中的一行如下。


66.249.68.6 - - [14/Jan/2012:06:25:03 -0800] "GET /example.com HTTP/1.1" 200 708 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

我尝试了以下几种正则表达式而没有任何成功。 (加载的表包含所有NULL值,表示正则表达式与输入不匹配)。


CREATE TABLE access_log (
  remote_ip STRING,
  request_date STRING,
  method STRING,
  request STRING,
  protocol STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES  (
"input.regex" = "([^ ]) . . [([^]]+)] \"([^ ]) ([^ ]) ([^ \"])\" *",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s"
)
STORED AS TEXTFILE;

我对正则表达式不太熟悉。有人可以帮我吗?

3 个答案:

答案 0 :(得分:11)

最后使用双'\'和'。*'(这很重要!):

CREATE EXTERNAL TABLE access_log (
        `ip`                STRING,
        `time_local`        STRING,
        `method`            STRING,
        `uri`               STRING,
        `protocol`          STRING,
        `status`            STRING,
        `bytes_sent`        STRING,
        `referer`           STRING,
        `useragent`         STRING
        )
    ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
    'input.regex'='^(\\S+) \\S+ \\S+ \\[([^\\[]+)\\] "(\\w+) (\\S+) (\\S+)" (\\d+) (\\d+) "([^"]+)" "([^"]+)".*'
)
STORED AS TEXTFILE
LOCATION '/tmp/access_logs/';

P.S。 Hive 0.7.1

答案 1 :(得分:7)

我使用rubular来测试我的正则表达式。 您也可以使用此表达式

([^ ]*) ([^ ]*) ([^ ]*) (?:-|\[([^\]]*)\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*)

您获得以下输出

1.  66.249.68.6
2.  -
3.  -
4.  14/Jan/2012:06:25:03 -0800
5.  "GET /example.com HTTP/1.1"
6.  200

答案 2 :(得分:1)

不是万无一失,但鉴于它是一个已知格式的日志文件,那么以下内容应该有效(在Hive中未经测试,但如果替换grep -E,则使用http://www.regexplanet.com/simple/index.html 1}} [^[][^\[] [^]])。假设您只想要特别提到的三个值。

[^\]]