Обработка других форматов
Ранее приведенные примеры загрузки данных JSON предполагают использование JSONEachRow
(ndjson). Мы предоставляем примеры загрузки JSON в других распространенных форматах ниже.
Массив объектов JSON
Одна из самых популярных форм JSON данных — это список объектов JSON в массиве JSON, как в этом примере:
Давайте создадим таблицу для такого рода данных:
Чтобы импортировать список объектов JSON, мы можем использовать формат JSONEachRow
(вставляя данные из файла list.json):
Мы использовали клаузу FROM INFILE для загрузки данных из локального файла, и можем видеть, что импорт прошел успешно:
Обработка NDJSON (JSON с разделителями по строкам)
Многие приложения могут записывать данные в формате JSON, так что каждая строка лога является отдельным объектом JSON, как в этом файле:
Тот же формат JSONEachRow
может работать с такими файлами:
Ключи объектов JSON
В некоторых случаях список объектов JSON может быть закодирован как свойства объектов, а не как элементы массива (см. objects.json для примера):
ClickHouse может загружать данные из такого рода данных, используя формат JSONObjectEachRow
:
Указание значений ключей родительского объекта
Предположим, мы также хотим сохранить значения ключей родительского объекта в таблице. В этом случае мы можем использовать следующую опцию для определения имени колонки, в которую мы хотим сохранить значения ключей:
Теперь мы можем проверить, какие данные будут загружены из оригинального JSON файла, используя функцию file()
:
Обратите внимание, что колонка id
была правильно заполнена значениями ключей.
JSON Массивы
Иногда, для экономии места, JSON файлы кодируются в массивы вместо объектов. В этом случае мы имеем дело со списком JSON массивов:
В этом случае ClickHouse загрузит эти данные и придаст каждому значению соответствующую колонку на основе его порядка в массиве. Мы используем формат JSONCompactEachRow
для этого:
Импортирование отдельных колонок из JSON массивов
В некоторых случаях данные могут быть закодированы по колонкам, а не по строкам. В этом случае родительский объект JSON содержит колонки со значениями. Посмотрите на следующий файл:
ClickHouse использует формат JSONColumns
для разбора данных, отформатированных таким образом:
Также поддерживается более компактный формат при работе с массивом колонок, а не с объектом, с использованием формата JSONCompactColumns
:
Сохранение JSON объектов вместо разбора
Существуют случаи, когда вы можете захотеть сохранить JSON объекты в одном столбце String
(или JSON) вместо их разбора. Это может быть полезно, когда речь идет о списке JSON объектов с различными структурами. Давайте возьмем этот файл, где у нас есть несколько различных JSON объектов внутри родительского списка:
Мы хотим сохранить оригинальные JSON объекты в следующую таблицу:
Теперь мы можем загрузить данные из файла в эту таблицу, используя формат JSONAsString
, чтобы сохранить JSON объекты вместо их разбора:
И мы можем использовать JSON функции для запроса сохраненных объектов:
Обратите внимание, что JSONAsString
отлично работает в случаях, когда у нас есть файлы, отформатированные как JSON объекты на строку (обычно используются с форматом JSONEachRow
).
Схема для вложенных объектов
В случаях, когда мы имеем дело с вложенными JSON объектами, мы можем дополнительно определить схему и использовать сложные типы (Array
, Тип данных Object
или Tuple
) для загрузки данных:
Доступ к вложенным JSON объектам
Мы можем ссылаться на вложенные ключи JSON, включив следующую настройку:
Это позволяет нам ссылаться на ключи вложенных объектов JSON с использованием точечной нотации (не забудьте обернуть их в символы обратной кавычки для корректной работы):
Таким образом, мы можем развернуть вложенные JSON объекты или использовать некоторые вложенные значения, чтобы сохранить их как отдельные колонки.
Пропуск неизвестных колонок
По умолчанию ClickHouse будет игнорировать неизвестные колонки при импорте JSON данных. Давайте попробуем импортировать оригинальный файл в таблицу без колонки month
:
Мы можем все еще вставить оригинальные JSON данные с 3 колонками в эту таблицу:
ClickHouse будет игнорировать неизвестные колонки во время импорта. Это можно отключить с помощью настройки input_format_skip_unknown_fields:
ClickHouse выбросит исключения в случаях несоответствия структуры JSON и колонок таблицы.
BSON
ClickHouse позволяет экспортировать и импортировать данные из файлов, закодированных в BSON. Этот формат используется некоторыми СУБД, например, базой данных MongoDB.
Чтобы импортировать данные BSON, мы используем формат BSONEachRow. Давайте импортируем данные из этого BSON файла:
Мы также можем экспортировать в BSON файлы, используя тот же формат:
После этого у нас будут экспортированы данные в файл out.bson
.