Сглаживание JSON с массивом с помощью поискового робота / классификатора / задания ETL AWS Glue

Я просматриваю следующий файл 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, невозможно правильно вывести схему искателя, и то, что я получил в Athena, не соответствует моим ожиданиям.

В следующем листинге показан ряд данных из 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 Glue Для создания схемы я попытался использовать классификаторы.

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


person Maciej Malak    schedule 19.03.2019    source источник


Ответы (1)


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

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

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

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

person Radu Simionescu    schedule 30.05.2019