Перейти к основному содержимому
Перейти к основному содержимому

Обработка других форматов

Ранее приведенные примеры загрузки данных 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.