JSON — сравнение поля во многих записях и устранение несоответствий типов

В одной записи (объект JSON) у нас есть

      {
        "name": "ID",
        "value": "4260567,4260556"
      }

В другой записи у нас есть

      {
        "name": "ID",
        "value": {}
      }

Моя проблема заключается в том, что этот набор данных не может быть запрошен в Apache Drill из-за того, что для одного поля используются разные типы — строки в одном случае и объекты в других. Я также не могу заменить {} на "" по всем направлениям, потому что есть другие поля, которые на самом деле должны быть объектами, с которыми это вызовет ту же проблему.

Моя идея состоит в том, чтобы написать некоторый код для загрузки в пакет данных, а также пройти поле за полем, перепроверить записи и исправить эти несоответствия типов. Например, если он увидит, что большинство записей в этом поле идентификатора являются строками и лишь некоторые из них являются пустыми объектами, он преобразует их в пустые строки. Если он увидит, что некоторые значения являются массивами/списками, а другие значения в том же поле являются отдельными объектами, он преобразует эти отдельные объекты в массивы/списки. Такие вещи.

Однако это довольно большая задача только для одного набора данных. Есть ли другие способы решить эту проблему?


person asdvbnm    schedule 01.11.2016    source источник


Ответы (1)


Существует экспериментальная настройка UNION. можешь попробовать, exec.enable_union_type:

ALTER SESSION SET `exec.enable_union_type` = true;

Подробнее

Я использую дрель 1.6. Я использовал следующие тестовые данные:

[
    {
        "name": "foo",
        "value": "4260567,4260556"
    },
    {
        "name": "bar",
        "value": {}
    },
    {
        "name": "baz",
        "value": ["one", "two", "three"]
    }
]

И запустил простой запрос

SELECT * FROM dfs.`/tmp/drill-sample.json`;

Что приводит к этой ошибке

Ошибка: DATA_READ ERROR: ошибка анализа JSON — вы попытались запустить, когда используете ValueWriter типа NullableVarCharWriterImpl.

Файл /tmp/drill-sample.json Запись 2 Фрагмент 0:0

Исправить

ALTER SESSION SET `exec.enable_union_type` = true;

Теперь парсинг JSON работает

0: jdbc:drill:zk=local> SELECT * FROM dfs.`/tmp/drill-sample.json`;
+-------+------------------------+
| name  |         value          |
+-------+------------------------+
| foo   | 4260567,4260556        |
| bar   | {}                     |
| baz   | ["one","two","three"]  |
+-------+------------------------+
3 rows selected (1.106 seconds)
person James    schedule 02.11.2016
comment
Благодарю вас! Это также работает, когда у вас есть некоторые элементы поля в массиве, а другие - в виде одного элемента? - person asdvbnm; 03.11.2016
comment
Да, он работает со значениями массива. Я обновил ответ, включив в него массив. - person James; 03.11.2016
comment
Большое спасибо. Сейчас я столкнулся с новой ошибкой, но нигде не могу найти документацию по этой или подобной ошибке. «Ошибка: DATA_READ ERROR: индекс: 0, длина: 65536 (ожидаемый: диапазон (0, 32768))», и ошибка указывает на определенную запись и поле в наборе данных. Я хотел опубликовать еще один вопрос, но решил, что сначала задам вам - person asdvbnm; 03.11.2016