У меня есть журнал доступа к пользовательскому формату apache со строками вроде:
Jan 1 23:59:59 ip-172-70-12-5 172.70.1.146 - - [01/Jan/2018:23:59:59 +0000] "GET /someurl HTTP/1.1" 200 22854 "somdomain.com" "5a4acbvv7f7d222" "-" "" "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10" 486029 "180.80.80.62"
В Афине у меня есть таблица, настроенная для обработки этого с помощью регулярного выражения, вот таблица DDL:
CREATE EXTERNAL TABLE `test_access_log`(
`remoteaddr` string COMMENT '',
`remotelogname` string COMMENT '',
`user` string COMMENT '',
`day` string COMMENT '',
`month` string COMMENT '',
`year` string COMMENT '',
`request` string COMMENT '',
`status` string COMMENT '',
`bytes_string` string COMMENT '',
`tenant` string COMMENT '',
`xrequestid` string COMMENT '',
`userid` string COMMENT '',
`referrer` string COMMENT '',
`browser` string COMMENT '',
`requesttime` string COMMENT '',
`originatorip` string COMMENT '')
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'input.regex'='(\\S+) (\\S+) (\\S+) \\[([0-9]*)\\/([a-zA-Z]*)\\/([0-9]*):[\\w:]+\\s[+\\-]\\d{4}\\] \\\"(.+?)\\\" (\\S+) (\\S+) \\\"([^\\\"]*)\\\" \\\"([^\\\"]*)\\\" \\\"([^\\\"]*)\\\" \\\"([^\\\"]*)\\\" \\\"([^\\\"]*)\\\" (\\S+) \\\"([^\\\"]*)\\\"$')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://mybucket/access-logs'
TBLPROPERTIES (
'has_encrypted_data'='false',
'transient_lastDdlTime'='1526982859')
Проблема в том, что предварительный просмотр этой таблицы возвращается, когда в каждом столбце отображается пустое значение.
Я протестировал регулярное выражение через онлайн-тестер Java, и выражение правильно возвращает все 16 элементов, как и ожидалось.
Если я запускаю SELECT COUNT (*) FROM test_access_log, тогда, как и ожидалось, я получаю ожидаемое количество строк, поэтому кажется, что можно было загрузить файлы в моем контейнере S3.Это заставляет меня думать, что это проблема регулярных выражений.
Есть идеи, что не так с регулярным выражением?