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

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

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