Файл json для внешней таблицы

0 Kobra [2017-08-15 14:34:00]

У меня есть данные в формате json.

  1. Правильный

[{ "Текст": "foo0", "номер": 123}, { "текст": "foo1", "номер": 345}, { "текст": "foo2", "номер": 678}, { "текст": "foo3", "номер": 901}]

  1. некорректный

{"text": "foo0", "number": 123} {"text": "foo1", "number": 345} {"text": "foo2", "number": 678} {"text": "foo3", "номер": 901}

Создание внешней таблицы

create external table js_test_3
(
  text string,
  number string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION '/Serde'

Затем я запускаю

select *
from js_test_3

В результате я получаю

  1. Исправьте json (извлекает столько элементов, сколько строк)

текстовый номер

{"number": "123", "text": "foo0"} {"number": "345", "text": "foo1"}

  1. Для неверного json- (извлекает только первый элемент)

текстовый номер

foo0 123

Как написать сценарий, который создает список, для которого результат правильный?

текстовый номер

foo0 123

foo1 345

foo2 678

foo3 901

Спасибо

json hive


1 ответ


0 highlycaffeinated [2017-08-15 17:18:00]

JsonSerDe, который вы используете, ожидает как входной файл с одним полным JSON в строке. Это желательно, поскольку он способен разделить вход (и делит работы между рабочими узлами) на CR/LF.

Если у вас есть хорошо сформированный список JSON, который вы показываете в своем "правильном JSON", вы можете использовать такой инструмент, как jq чтобы преобразовать ваш входной файл в ожидаемый формат. Например:

jq -c .[] correct.json > /serde-input.txt