RegEx для создания таблицы AWS Athena (RegexSerDe)

Я пытаюсь создать таблицу AWS Athena на основе журналов, хранящихся в S3. Я намерен использовать RegEx для создания таблицы, но не смог найти RegEx, который мне подойдет.

CREATE EXTERNAL TABLE `dev_logs`(
  `date_time` string COMMENT '', 
  `type` string COMMENT '', 
  `request_id` string COMMENT '', 
  `body` string COMMENT '', 
  `exception` string COMMENT '')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES ( 
  'input.regex'='\\[([^ ]* +[^ ]*)\\] \\[([^ ]*)\\] ([^ ]*) \\[([^ ]* +[^ ]*)\\] (\\*)'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://dev/logs'

Логи в таком формате

[2020-05-04 10:26:56.393] [INFO] [123] [Building host...] []
[2020-05-04 10:27:01.623] [INFO] [] [Starting Service checks...] [exception details]

person Moin    schedule 24.06.2020    source источник


Ответы (1)


Регулярное выражение

'\\[(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d*)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\].*?$'

В Hive вы можете легко отладить его, используя regexp_replace:

select regexp_replace('[2020-05-04 10:26:56.393] [INFO] [123] [Building host...] []',
                      '\\[(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d*)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\].*?$',
                     '$1, $2, $3, $4, $5')

Результат

2020-05-04 10:26:56.393, ИНФОРМАЦИЯ, 123, Хост здания...,

person leftjoin    schedule 24.06.2020
comment
Поле body многострочное. Как получить весь контент - person Moin; 24.06.2020
comment
@Moin прочитайте этот вопрос: stackoverflow.com/q/17935200/2700344 - person leftjoin; 24.06.2020