尝试使用正则表达式将日志解析为AWS Athena

时间:2018-04-09 17:41:42

标签: regex amazon-web-services amazon-s3 amazon-athena

我是AWS Athena和regex的新手,我们将日志存储在S3存储桶中并尝试使用athena来查询目的。 记录示例:

2018-03-13T14:05:40:624-0400  ID:414d512044414c444552323120202020eed8905aa3af1020                                                 |<Large String>

我使用以下命令在表格中存储datetime idlog -

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

我很确定我在正则表达式中做错了,我正在努力,但是在这里发布这个问题是为了向正确的方向推进。 我已经查阅了相关的帖子,但找不到能帮我解决问题的内容。

1 个答案:

答案 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) \\|([^|]*)$"