регулярное выражение для доступа к журналу в улье serde

Я хочу извлечь (ip, requestUrl, timeStamp) из журналов доступа для загрузки в базу данных куста. Одна строка из журнала доступа выглядит следующим образом.


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;

Я не очень разбираюсь в регулярных выражениях. Кто-нибудь может мне с этим помочь?


person chamibuddhika    schedule 01.02.2012    source источник


Ответы (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
person surajz    schedule 15.08.2012

Используйте в конце двойные '\' и '. *' (Это важно!):

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. Улей 0.7.1

person agorokhov    schedule 11.11.2012
comment
Не могли бы вы объяснить причину, по которой "используйте двойные" \ "и". * "В конце? - person saurzcode; 02.01.2015
comment
Это НАМНОГО важнее, чем предполагалось. \\ необходим, потому что регулярное выражение находится внутри строки, которая является частью SQL-запроса ... поэтому, чтобы получить \ S, вам нужно ввести \\ S, чтобы вы получили фактическое (т.е. экранированное) обратная косая черта как часть команды. \\ S + будет соответствовать одному или нескольким непробельным символам. \ S * просто пытается сопоставить 0 или более заглавных символов S. - person TheProletariat; 15.04.2017
comment
. * В конце предназначен только для очистки на случай, если вы что-то пропустили с соответствующими группами. - person TheProletariat; 15.04.2017
comment
Двойник \ спас мне день. Большое спасибо. - person Ali Hashemi; 16.04.2017
comment
Я бы хотел, чтобы Hive, AWS Athena и другие документы включали этот пример. - person Michael Helmke; 21.06.2017

Не надежно, но, учитывая, что это файл журнала в известном формате, следующее должно работать (не проверено в 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"
person IBBoard    schedule 02.02.2012