新手求助:如何用正则将S3日志解析至AWS Athena
解决AWS Athena用正则解析S3日志的问题
嘿,刚接触Athena和正则表达式的话,确实需要花点时间捋清楚怎么把非结构化日志拆成结构化字段。针对你给出的日志格式,我帮你整理了完整的表创建语句,还会拆解正则的逻辑,让你明白每部分是怎么匹配的。
你的日志示例是:
2018-03-13T14:05:40:624-0400 ID:414d512044414c444552323120202020eed8905aa3af1020 |
下面是可以直接用的CREATE TABLE语句:
CREATE EXTERNAL TABLE IF NOT EXISTS monkey_banana_audit_logs ( Date STRING, Time STRING, ID STRING, RAWMESSAGE STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'input.regex' = '^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2}:\\d{2}:\\d{3}-\\d{4}) ID:([^ ]+) \\|(.*)$' ) LOCATION 's3://your-bucket-name/path-to-logs/';
正则表达式拆解(对应字段顺序)
^(\\d{4}-\\d{2}-\\d{2}):匹配开头的日期部分(比如2018-03-13),对应Date字段T(\\d{2}:\\d{2}:\\d{2}:\\d{3}-\\d{4}):匹配T后面的时间带时区部分(比如14:05:40:624-0400),对应Time字段ID:([^ ]+):匹配ID:后面直到空格的内容(也就是你的ID字符串),对应ID字段,[^ ]+表示匹配任意非空格字符直到遇到空格\\|(.*)$:匹配|后面的所有内容(也就是你的部分), .*表示匹配任意字符直到行尾,对应RAWMESSAGE字段
几个注意事项
- 记得把
LOCATION里的s3://your-bucket-name/path-to-logs/替换成你实际的S3日志存储路径 - Athena使用的是Hive的RegexSerDe,正则里的特殊字符(比如
|)需要用双反斜杠转义,所以你看到的是\\| - 如果日志里有一些特殊情况(比如ID里有空格?不过从你的示例看没有),可能需要调整正则,你可以先用Athena的
regexp_extract函数测试正则是否匹配:
替换后面的数字1/2/3/4可以分别测试对应字段的匹配结果SELECT regexp_extract('2018-03-13T14:05:40:624-0400 ID:414d512044414c444552323120202020eed8905aa3af1020 |<Large String>', '^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2}:\\d{2}:\\d{3}-\\d{4}) ID:([^ ]+) \\|(.*)$', 1) AS date_test;
内容的提问来源于stack exchange,提问作者Shek
相关产品推荐
相关产品推荐

