我有一个自定义格式的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"
在Athena中,我设置了一个表来使用正则表达式来处理它,这里是表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存储桶中加载文件。这让我觉得这是一个正则表达式问题。
任何想法正则表达式有什么问题?