我是AWS Athena和regex的新手,我们将日志存储在S3存储桶中并尝试使用athena来查询目的。 记录示例:
2018-03-13T14:05:40:624-0400 ID:414d512044414c444552323120202020eed8905aa3af1020 |<Large String>
我使用以下命令在表格中存储date
,time
id
和log
-
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}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])* ^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d) (?<=ID:).*?(?=\s) [^|]*$",
"output.format.string" = "%1$s %2$s %3$s %4$s"
) LOCATION 's3://monkey-business-dev/banana/tree/peel-log/2018-03-13/';
以上查询运行正常,但当我尝试预览前100时,我收到以下错误 -
HIVE_CURSOR_ERROR: Number of matching groups doesn't match the number of columns
我很确定我在正则表达式中做错了,我正在努力,但是在这里发布这个问题是为了向正确的方向推进。 我已经查阅了相关的帖子,但找不到能帮我解决问题的内容。
答案 0 :(得分:0)
^(\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01]))T(([01]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)):\d{3}\-\d{4}.*(?<=ID:)(.*?)(?=\s) \|([^|]*)$
说明:https://regex101.com/r/lfZmRI/1
替换可能是:$1 $4 $8 $9
对于您的查询,您可能希望转义反斜杠,它会为您提供:
"input.regex" = "^(\\d{4}\\-(0?[1-9]|1[012])\\-(0?[1-9]|[12][0-9]|3[01]))T(([01]?\\d|2[0-3]):([0-5]?\\d):([0-5]?\\d)):\\d{3}\\-\\d{4}.*(?<=ID:)(.*?)(?=\\s) \\|([^|]*)$"