2016-11-01 3 views
1

В одной записи (объект JSON), мы имеемJSON - сравнить поле во многих записях и устранения расхождений типа

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

В другой записи, мы имеем

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

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

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

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

ответ

0

Существует experimental UNION setting вы можете попробовать, 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`; 

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

Error: DATA_READ ERROR: Error parsing JSON - You tried to start when you are using a ValueWriter of type NullableVarCharWriterImpl.

File /tmp/drill-sample.json Record 2 Fragment 0:0

Fix

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) 
+0

Спасибо! Это также работает, когда у вас есть некоторые члены поля в массиве, а другие - как один элемент? – asdvbnm

+0

Да, он работает со значениями массива. Я обновил ответ, чтобы включить массив. – James

+0

Отлично, спасибо. Я действительно сталкиваюсь с новой ошибкой сейчас, но я не могу найти документацию для этой или аналогичной ошибки где угодно. 'Ошибка: DATA_READ ERROR: индекс: 0, длина: 65536 (ожидается: диапазон (0, 32768))', и ошибка указывает на конкретную запись и поле в наборе данных. Я собирался задать еще один вопрос, но решил, что сначала спрошу вас – asdvbnm