Улей - Regex для SYSLOG / ERRORLOG - PullRequest
       96

Улей - Regex для SYSLOG / ERRORLOG

1 голос
/ 22 сентября 2019

Я хочу запросить системный журнал (в основном это мой журнал ошибок SQL) с помощью Athena.Вот мои примеры данных.

2019-09-21T12:19:32.107Z 2019-09-21 12:19:24.17 Server      Buffer pool extension is already disabled. No action is necessary. 

2019-09-21T12:19:32.107Z 2019-09-21 12:19:24.29 Server      InitializeExternalUserGroupSid failed. Implied authentication will be disabled.

Итак, я создал такую ​​таблицу:

CREATE EXTERNAL TABLE IF NOT EXISTS bhuvi (
  timestamp string,
  date string,
  time string,
  user string,
  message stringg
 ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
 WITH SERDEPROPERTIES (
 "input.regex" = "(\\w+)\\s+(.*\\-.*\\-.*)\\s+(\\d+:\\d+:\\d+.\\d+)\\s+(\\w+)\\s+(\\w+)"
 ) LOCATION 's3://log/sql_error_log_stream/';

Но она не дала никаких результатов.Может кто-нибудь помочь мне разобраться?

1 Ответ

1 голос
/ 22 сентября 2019

Несколько наблюдений:

  1. Отметка времени '2019-09-21T12:19:32.107Z' не в формате куста TIMESTAMP, определите его как STRING в DDL и конвертируйте, как в этом ответе: https://stackoverflow.com/a/23520257/2700344
  2. сообщение в serde представляется как (\ w +) группа.Это неправильно, потому что сообщение содержит пробелы.Попробуйте (.*?)$ вместо (\\w+) для поля сообщения.

    Попробуйте это регулярное выражение:

    (\\S+)\\s+(.*-.*-.*)\\s+(\\d+:\\d+:\\d+\\.\\d+)\\s+(\\S+)\\s+(.*?)$

Используйте (\\S+) - этоозначает все, кроме пробелов.(\\w+) не работает для первой группы, поскольку \\w соответствует любому буквенно-цифровому символу и только символу подчеркивания, а первая группа (отметка времени) также содержит - и : символов.

Также дефис -, если за пределами класса символов [в квадратных скобках] не требуется экранирование.и точкаимеет особое значение и нуждается в экранировании при буквальном использовании как точка: https://stackoverflow.com/a/57890202/2700344

...