запрос AWS данных о пожарных шлангах в s3 с помощью Athena - не может запрашивать пакеты - PullRequest
0 голосов
/ 04 марта 2020

Я отправляю логи в корзину S3 через Firehose.

Данные имеют очень простой формат:

{
   email: "some email",
   message: "a log message",
   data: "{ /* ...some json */ }"
}

Я создал это определение таблицы для Афины:

CREATE EXTERNAL TABLE `logs`(
  `email` string COMMENT 'from deserializer', 
  `message` string COMMENT 'from deserializer', 
  `data` string COMMENT 'from deserializer')
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://USERLOGS/'
TBLPROPERTIES (
  'has_encrypted_data'='false', 
  'transient_lastDdlTime'='1583271303')

Он хорошо работает с отдельными записями, где s3 file - это один json blob, но, как работает firehose, он объединяет записи в файлы в s3; только первая запись в пакете запрашивается.

Как сделать так, чтобы запрашивалась вся партия?

У меня есть 100 BLOB-объектов, но из-за этого я могу видеть только 6.

1 Ответ

2 голосов
/ 04 марта 2020

Я сталкивался с подобной проблемой.

Способ, которым Firehose создает файлы в S3, заключается в объединении каждой записи в существующий файл, что фактически приводит к неверному JSON. Это означает, что если вы поставите две записи:

{"key":"1", "value":"v1"}

и

{"key":"2", "value":"v2"}

, они будут записаны в S3 следующим образом:

{"key":"1", "value":"v1"}{"key":"2", "value":"v2"}

С другой стороны стороны, Афина ожидает найти каждую запись в новом ряду. При этом единственный обходной путь, который мне удалось найти, - это вставить '\ n' в записи, отправляемые в Firehose, чтобы вывод S3 выглядел следующим образом:

{"key":"1", "value":"v1"}
{"key":"2", "value":"v2"}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...