我希望使用 Athena 从 S3 访问日志中获取查询参数的映射。
例如,对于以下日志行示例:
283e.. foo [17/Jun/2017:23:00:49 +0000] 76.117.221.205 - 1D0.. REST.GET.OBJECT 1x1.gif "GET /foo.bar/1x1.gif?placement_tag_id=0&r=574&placement_hash=12345... HTTP/1.1" 200 ... "Mozilla/5.0"
我想得到 [k, v] 的地图查询参数:
Placement_tag_id,0 r,574placement_hash,12345
因此,我将能够运行以下查询:
select * from accessLogs where queryParams.placement_tag_id=0 and X.r>=500
查询参数计数和内容因一个请求而异,因此我不能使用静态 RegEx 模式。
我serde2.RegexSerDe
在以下 Athena 创建表查询中使用了对日志进行基本拆分,但没有找到实现我想要的方法。我曾想过使用 MultiDelimitSerDe,但 Athena 不支持它。
关于如何实现这一目标的任何建议?
CREATE EXTERNAL TABLE IF NOT EXISTS elb_db.accessLogs (
timestamp string,
request string,
http_status string,
user_agent string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1',
'input.regex' = '[^ ]* [^ ]* \\[(.*)\\] [^ ]* [^ ]* [^ ]* [^ ]* [^ ]* "(.*?)" ([^ ]*) [^ ]* [^ ]* [^ ]* [^ ]* [^ ]* ".*?" "(.*?)" [^ ]*'
) LOCATION 's3://output/bucket'