регулярное выражение для входа в hive serde
Я хочу извлечь (ip, requestUrl, timeStamp) из журналов доступа для загрузки в базу данных hive. Одна строка из access log выглядит следующим образом.
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)"
Я попытался со следующими и несколькими вариациями regex без успеха. (Загруженная таблица имеет все нулевые значения, указывающие, что регулярное выражение не соответствует входным данным).
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;
Я не очень опытен с regex. Кто-нибудь может мне помочь?
3 ответов
Я использую 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
используйте двойные ' \ ' и '.* 'в конце концов (это важно!):
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/';
П. С. Улей 0.7.1
не доказательство дурака, но учитывая, что это файл журнала в известном формате, тогда должно работать следующее (непроверено в Hive, но работает с grep -E
и http://www.regexplanet.com/simple/index.html если заменить [^[]
С [^\[]
и [^]]
С [^\]]
). Предполагается, что вам нужны только три значения, которые вы конкретно упомянули.
"input.regex" = "([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)[^[]+\[([^]]+)\][^/]+([^ ]+).+"
"output.format.string" = "%1$s %2$s %3$s"