Обработка других форматов
Ранее приведенные примеры загрузки данных 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 Data Type
или 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
.