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

У меня есть данные в формате 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

Спасибо

1 ответ

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

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

jq -c .[] correct.json > /serde-input.txt
Другие вопросы по тегам