Я сканирую следующий файл 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 с помощью специального сценария, но пока не получилось.