Создание схемы Athena, когда в формате журнала отсутствуют поля - PullRequest
0 голосов
/ 14 мая 2019

У меня есть собственный формат журнала, где записи журнала меняются в зависимости от типа запроса. Таким образом, определенные строки имеют больше полей.

Можем ли мы указать некоторые поля как необязательные, чтобы в пропущенных строках значения были установлены на определенные значения по умолчанию (ноль, 0)?

Вот некоторые гипотетические записи в журнале:

{"data":"[2017-09-10 10:44:54.448998 -0000] info ip=773.555.557.445 cluster=\"production\" query=uris type=TXT class=IN rcode=NXDOMAIN cnt=0 offset=74","header":{"recvtime":"2017-09-10 10:45:02","server":"m0107481","refid":"ABC-123"}}

{"data":"[2017-09-10 10:44:54.457718 -0000] info ip=991.509.704.832 cluster=\"inbound\" query=dnsbl type=A class=IN rcode=NOERROR cnt=1 offset=90 score=400","header":{"recvtime":"2017-09-10 10:45:02","server":"m010748","refid":"ABC-123"}}

{"data":"[2017-09-10 10:44:54.457718 -0000] info ip=971.509.704.832 cluster=\"inbound\" query=dnsbl type=A class=IN rcode=REFUSED cnt=1","header":{"recvtime":"2017-09-10 10:45:02","server":"m010574","refid":"ABC-123"}}

Обратите внимание, что каждая строка данных журнала представлена ​​в формате json, а часть заголовка является фиксированной. Если запрос в данных dnsbl, то иногда в строке есть поле оценки, но в других случаях оно отсутствует. И я планирую использовать Athena для анализа данных этого типа с S3 и запроса некоторых статистических данных в строке: какой% данных является запросом DNS и какой% имеет оценку выше 300.

1 Ответ

1 голос
/ 14 мая 2019

Похоже, ваши данные в формате JSON со встроенной структурной регистрацией в поле data. Пока данные хорошо сформированы в формате JSON с одним объектом на строку, вы сможете создавать таблицы JSON, а затем использовать функции для извлечения других фрагментов из поля data. Вы можете создать представление, которое выполняет извлечение, чтобы вам не приходилось делать это в каждом запросе.

Я думаю что-то вроде этого:

CREATE EXTERNAL TABLE raw_log_entries (
  data string,
  header struct<recvtime: string, server: string, refid: string>
)   
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://some-bucket/and/path/';
CREATE VIEW log_entries AS
SELECT
  header.recvtime,
  header.server,
  header.refid,
  regexp_extract(data, 'query=(\S+)', 1) AS query,
  regexp_extract(data, 'type=(\S+)', 1) AS type,
  regexp_extract(data, 'score=(\S+)', 1) AS score,
  -- and so on
FROM raw_log_entries

Вам придется поэкспериментировать с регулярными выражениями, так как у меня нет ваших данных, я не могу быть уверен, что они будут работать для всех случаев, но я надеюсь, что вы поняли.

...