Афина: используйте только подмножество полей JSON - PullRequest
0 голосов
/ 18 декабря 2018

У меня довольно сложные вложенные журналы JSON.Я хотел бы создать внешнюю таблицу Athena на основе этих журналов, но использовать только НЕКОТОРЫЕ поля JSON в таблице.

У меня есть два вопроса:

  1. Я все ещеНужно ли создавать полный сложный DDL с вложенными структурами, хотя мне не нужно большинство полей там?
  2. при условии, что я могу это сделать, и я сохраняю журналы JSON в формате Parquet на S3 - будет сканировать Афинатолько те части / поля логов я указываю?Или он все равно будет выполнять полное сканирование по полной цене?:-)

упрощенный пример события JSON:

{
  "name": "n1",
  "f1": "v1",
  "group1": {
     "g1F1": "v1",
     "g1F2": "v2",
     "group11": {
         "g11F1": "v1",
         "g11F2": "v2"
     },
     "group12": {
         "g12F1": "v1",
         "g12F2": "v2"
     }
   },
   "group2": {
     "g2F1": "v1",
     "g2F2": "v2",
      ...
   },
   ...
}  

Допустим, меня интересуют только поля верхнего уровня "name", "f1" и некоторые вложенные поля, скажем, поля "group2" "g2F1" и "g2F2".Могу ли я сделать что-то вроде этого:

CREATE EXTERNAL TABLE mytable (
  name string,
  f1 string,
  group2 struct<g2F1: string, g2F2: string>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://<mybucket>'

?

Когда я пробую этот подход - DDL запускается без ошибок, таблица создается, но «select * from mytable» не возвращает результатов ...

Спасибо !!


Обновление:

Решение для вопроса / проблемы 1: Не знаю почему, но как только я снова загрузил gzipped журналы в S3 - создание таблицы и запросы начали работать!

По Вопросу 2 - см. Ответ Танвера ниже.


Обновление 2:

Для тех, кто также рассматривает этот вариант: я получил таблицу Athena, созданную с примерно 6Gсжатых данных - все хорошо.Однако время выполнения запроса чрезвычайно велико.Простой запрос с фильтром по нескольким полям занимает около 25-30 минут .... Учитывая, что это всего лишь POC, использующий 6G, и у меня было бы несколько сотен Ts по-настоящему - этот вариант не выполним для моеговариант использования.Конечно, я не использовал формат Parquet - но поскольку мне часто требовалось большинство столбцов, я не думаю, что использование Parquet значительно улучшило бы производительность запросов для меня.

1 Ответ

0 голосов
/ 19 декабря 2018

Ответы ниже.

  1. Причина, по которой ваш запрос не возвращает данные, поскольку Афина не любит разрыв строки в данных json.Ваше определение таблицы идеально, и вам не нужно создавать определение таблицы для всех данных.Это хорошо в схеме на чтение.Все ваши данные должны быть в одной строке, как показано ниже.Тогда ваш запрос Athena вернет данные.Не унывай.Glue ETL может читать файл json с переносами строк, поскольку Glue ETL запускает Spark под капотом.Таким образом, вы можете преобразовать свой json-файл в паркет, используя Glue ETL, а затем создать таблицу Athena поверх данных о паркете.

    {"name": "n1", "f1": "v1", "group1": {"g1F1": "v1", "g1F2": "v2", "group11": {"g11F1": "v1", "g11F2": "v2"}, "group12": {"g12F1": "v1 "," g12F2 ":" v2 "}}," group2 ": {" g2F1 ":" v1 "," g2F2 ":" v2 "}}

  2. после преобразованияданные в паркет, вы будете платить только за столбец, который вы используете в запросе, а не за всю таблицу, как объяснено здесь .

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