Выровнять JSON с массивом с помощью AWS Glue Crawler / Classifier / ETL job - PullRequest
0 голосов
/ 19 марта 2019

Я сканирую следующий файл JSON (это действительный JSON) из озера данных s3. Внутри есть 2 поля (устройство, отметка времени) и массив объектов, называемых «данными». Каждый объект в массиве данных отличается друг от друга.

{"device":"0013374838793C8","timestamp":"2019-03-04T14:44:39Z","data":[         { "eparke_status":"09"},            { "eparke_x":"FFF588"},         { "eparke_y":"000352"},         { "eparke_z":"000ACC"},         { "eparke_temp":"14.00"},           { "eparke_voltage":"4.17"}      ] }

К сожалению, когда я сканирую с помощью AWS Glue Crawler, схема не может быть выведена правильно, и то, что я получил в Афине, не то, что я ожидаю.

Следующий листинг показывает ряд данных из AWS Athena.

1   0013374838793C8 2019-03-05T13:11:41Z    [{eparke_status=0B, eparke_x=null, eparke_y=null, eparke_z=null, eparke_temp=null, eparke_voltage=null}, {eparke_status=null, eparke_x=FFF6D4, eparke_y=null, eparke_z=null, eparke_temp=null, eparke_voltage=null}, {eparke_status=null, eparke_x=null, eparke_y=000133, eparke_z=null, eparke_temp=null, eparke_voltage=null}, {eparke_status=null, eparke_x=null, eparke_y=null, eparke_z=000DA3, eparke_temp=null, eparke_voltage=null}, {eparke_status=null, eparke_x=null, eparke_y=null, eparke_z=null, eparke_temp=14.00, eparke_voltage=null}, {eparke_status=null, eparke_x=null, eparke_y=null, eparke_z=null, eparke_temp=null, eparke_voltage=4.17}]

Как видите, для каждого объекта в массиве схема обнаружена «неправильно». Каждый столбец в БД содержит ВСЕ поля полей массива, большинство из которых просто установлены как нули, что понятно, потому что они не найдены. Обнаруженная схема - это не то, что я ищу.
Ожидания

В следующем листинге показана ожидаемая форма строки таблицы после сканирования с помощью AWS Glue.

1   0013374838793C8 2019-03-05T13:11:41Z    eparke_status=0B eparke_x=FFF6D4 eparke_y=000133 eparke_z=000DA3 eparke_temp=14.00 eparke_voltage=4.17

Что я уже пробовал?

Классификаторы клея AWS Для форсирования схемы я попытался использовать классификаторы.

$.device $.timestamp $.eparke_status $.eparke_x $.eparke_y $.eparke_z $.eparke_temp $.eparke_voltage

и

$.device $.timestamp $.data[0].eparke_status $.data[1].eparke_x $.data[2].eparke_y $.data[3].eparke_z $.data[4].eparke_temp $.data[5].eparke_voltage

Тем не менее, окончательная схема выглядит одинаково - все объекты упакованы внутри каждого столбца.

Есть идеи, как решить эту проблему? Я также пытаюсь настроить работу ETL с помощью специального сценария, но пока не получилось.

1 Ответ

0 голосов
/ 30 мая 2019

Одна вещь, которую я заметил, заключается в том, что после однократного запуска сканера изначально выведенная схема и выбранные сканеры, как правило, не изменяются при новом запуске.Я просто думаю, что безопаснее дублировать сканеры и удалять любые ранее созданные таблицы во время игры.

Я не уверен, что вы можете объединить несколько корневых выражений в выражении классификатора Json.Документация говорит, что для классификатора JSON вам просто нужно указать путь к узлу каждой строки, который будет рассматриваться как фактический json, чтобы выводить схему из

Чтобы использовать каждый элемент массива для вывода схемы,вам придется использовать $ .data [*].Но это будет означать, что вы пропустите устройство и отметку времени.

Вы не можете сделать это просто через сканер.Я рекомендую проанализировать без специального классификатора и затем UNNEST данных из структуры массива с помощью запроса Athena (https://docs.aws.amazon.com/athena/latest/ug/flattening-arrays.html).. При необходимости загрузить результат в какое-то хранилище данных. Для S3, посмотрите на CTAS как вариант. Вы можететакже можно настроить это как задание ETL

...