Игнорировать ключи объекта; только добавить JSON тело? - PullRequest
1 голос
/ 19 июня 2020

У меня есть данные, структурированные таким образом, что я хочу их сканировать и добавлять в Афину:

key_1: {id: key_1, name: name_1, other_data: data_1}
key_2: {id: key_2, name: name_2, other_data: data_2}
key_3: {id: key_3, name: name_3, other_data: data_3}

В идеале, я бы хотел, чтобы схема таблицы Glue выглядела так:

id:string
name:string
other_data:string

Но вместо этого Glue создает схему, которая:

key_1:
  id:string
  name:string
  other_data:string
key_2:
  id:string
  name:string
  other_data:string
key_3:
  id:string
  name:string
  other_data:string

Есть ли способ заставить Glue игнорировать внешние ключи и вместо этого разрабатывать схему только для содержимого тела без изменения базового файла S3 сам?

Конфигурация связки:

  • Обновления схемы в хранилище данных Обновить определение таблицы в каталоге данных.
  • Наследовать схему из таблицы Обновить все новые и существующие разделы с метаданными из таблицы.
  • Удаление объекта в хранилище данных Отметить таблицу как устаревшую в каталоге данных.

1 Ответ

0 голосов
/ 21 июня 2020

Нет, без использования Glue config. Glue Crawlers не очень умны и обычно не могут решать ничего, кроме самых простых c задач, но в данном случае ограничение есть в Афине. Вы не можете указать таблице распаковать такую ​​структуру.

В вашем примере строки имеют разные ключи (key_1, key_2, key_3), действительно ли они разные от строки к строке или на самом деле это одно и то же ключ в каждой строке? Поскольку вы используете одни и те же строки для свойства id, я предполагаю, что они как-то связаны?

Если они разные, я думаю, вам более или менее не повезло, каждая строка заставит Glue Crawler создать другой столбец, и вы, вероятно, получите произвольный набор столбцов где-то около предела количества разрешенных столбцов - и набор столбцов будет меняться в зависимости от порядка, в котором краулер видел строки в конкретный день. К сожалению, это никогда не будет работать с Glue или Athena.

Если, однако, внешний ключ в каждой строке одинаковый (скажем, «external_key»), вы можете создать представление, которое выполняет распаковку для вы, так что ваши запросы не должны:

CREATE VIEW unpacked_rows AS
SELECT outer_key.id, outer_key.name, outer_key.other_key
FROM my_table

Затем вы можете запросить это представление, как любую таблицу, и получить желаемый результат:

SELECT * FROM unpacked_rows
id    | name   | other_key
------+--------+----------
key_1 | name_1 | data_1
key_2 | name_2 | data_2
key_3 | name_3 | data_3
...