Афина: пользовательские проблемы с регулярным выражением в формате журнала Apache - PullRequest
0 голосов
/ 22 мая 2018

У меня есть журнал доступа к пользовательскому формату 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.Это заставляет меня думать, что это проблема регулярных выражений.

Есть идеи, что не так с регулярным выражением?

...