Apache Drill - Получение ошибки по методу KVGEN - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть огромный набор данных, где у каждой записи есть данные json, подобные приведенным ниже -

{"project": {"id": "2625", "createDate": 1542597000000, "rank": 0, "изюминка": ложные, "isDisplay": правда, "isNewProject": правда, "PropertyID": 2231, "районы": { "ID": 41, "имя": "ABC", "регион":"123"}}}

Когда я пытаюсь сгенерировать пары значений ключа, используя select kvgen(t.project) from dfs.filePath t в apache Drill, я получаю ошибку ниже -

DrillRuntimeException: Mappify/ kvgen не поддерживает гетерогенные типы значений.Все значения во входной карте должны быть одного типа.Поле [createDate] имеет другой тип [minor_type: BIGINT mode: OPTIONAL]

Похоже, что детализация ожидает, что все значения будут одного типа.Но как это сделать?Есть ли какая-либо функция, доступная в тренировке?

Моя версия тренировки 1.9.0

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Я понял это.Метод KVGEN не работает, если json является вложенным.Чтобы это работало, есть два подхода, которым можно следовать -

  • Извлечь вложенный json за пределы

{"project": {"id": "2625", "createDate": 1542597000000, "Оценка": 0, "изюминка": ложные, "isDisplay": правда, "isNewProject": правда, "PropertyID": 2231}, "районы": { "ID": 41, "name": "abc", "region": "123"}}

, а затем примените метод KVGEN как select kvgen(t.project) from dfs.filePath t

  • Сначала примените метод kvgen к внутреннему json, а затем используйте вложенный запрос, как показано ниже

    select tbl2.col1.id, tbl2.col2.value from (select tbl1.project as col1, flatten(kvgen(tbl1.project.districts)) col2 from dfs.filePath tbl1) tbl2

И, как справедливо упомянуто @ arina-yelchiyeva, опция сеанса store.json.all_text_modeдолжно быть установлено в true.

0 голосов
/ 22 ноября 2018

Попробуйте установить для параметра сеанса store.json.all_text_mode значение true.

https://drill.apache.org/docs/json-data-model/

...