Перейти к основному содержанию
В предыдущих примерах загрузки данных в формате JSON предполагается использование JSONEachRow (NDJSON). Этот формат интерпретирует ключи в каждой строке JSON как столбцы. Например:
Хотя обычно используется именно этот формат JSON, вы также можете столкнуться с другими форматами или вам может понадобиться считать JSON как единый объект. Ниже приведены примеры чтения и загрузки JSON в других распространённых форматах.

Чтение JSON как объекта

В предыдущих примерах показано, как JSONEachRow читает JSON, разделённый символами новой строки: каждая строка интерпретируется как отдельный объект, сопоставляется со строкой таблицы, а каждый ключ — со столбцом. Это идеально подходит для случаев, когда структура JSON предсказуема и для каждого столбца используется только один тип. В отличие от этого, JSONAsObject рассматривает каждую строку как отдельный объект JSON и сохраняет его в одном столбце типа JSON, поэтому этот формат лучше подходит для вложенной полезной нагрузки JSON и случаев, когда ключи являются динамическими и потенциально могут иметь более одного типа. Используйте JSONEachRow для построчной вставки, а JSONAsObject — для хранения гибких или динамических данных JSON. Сравните приведённый выше пример со следующим запросом, который читает те же данные как объект JSON в каждой строке:
JSONAsObject полезен для вставки строк в таблицу с помощью одного столбца с объектом JSON, например.
Формат JSONAsObject также может быть полезен для чтения JSON, разделённого символами новой строки, в случаях, когда структура объектов непоследовательна. Например, если тип значения по одному и тому же ключу различается от строки к строке (иногда это строка, а в других случаях — объект). В таких случаях ClickHouse не может вывести стабильную схему с помощью JSONEachRow, а JSONAsObject позволяет выполнять приём данных без строгой типизации, сохраняя каждую JSON-строку целиком в одном столбце. Например, обратите внимание, как JSONEachRow выдаёт ошибку в следующем примере:
Напротив, в этом случае можно использовать JSONAsObject, поскольку тип JSON поддерживает несколько типов для одного и того же подстолбца.

Массив объектов JSON

Один из самых распространённых форматов JSON-данных — список объектов JSON в JSON-массиве, как в этом примере:
Давайте создадим таблицу для таких данных:
Чтобы импортировать список объектов JSON, можно использовать формат JSONEachRow (для вставки данных из файла list.json):
Мы использовали конструкцию FROM INFILE, чтобы загрузить данные из локального файла, и видим, что импорт прошёл успешно:

Ключи объектов 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, JSON или 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.
Последнее изменение 2 июля 2026 г.