Перейти к основному содержанию
В следующих примерах показано, как загружать структурированные и полуструктурированные данные JSON. Для более сложных случаев, включая вложенные структуры, см. руководство Проектирование схемы JSON.

Загрузка структурированного JSON

В этом разделе предполагается, что данные JSON представлены в формате NDJSON (Newline delimited JSON), известном в ClickHouse как JSONEachRow, и имеют чёткую структуру, то есть имена столбцов и их типы фиксированы. NDJSON является предпочтительным форматом для загрузки JSON благодаря компактности и экономному использованию пространства, однако для ввода и вывода поддерживаются и другие форматы. Рассмотрим следующий пример JSON, представляющий строку из набора данных Python PyPI:
Чтобы загрузить этот объект JSON в ClickHouse, необходимо определить схему таблицы. В этом простом случае структура статична, имена столбцов известны, а их типы чётко определены. Несмотря на то что ClickHouse поддерживает полуструктурированные данные через тип JSON, где имена ключей и их типы могут быть динамическими, в данном случае это не нужно.
По возможности отдавайте предпочтение статическим схемамЕсли ваши столбцы имеют фиксированные имена и типы и появления новых столбцов не ожидается, в продакшене всегда предпочитайте статически определённую схему.JSON type предпочтителен для сильно динамичных данных, где имена и типы столбцов могут меняться. Этот тип также полезен на этапе прототипирования и исследования данных.
Простая схема для этого показана ниже, где ключи JSON соответствуют именам столбцов:
Ключи сортировкиЗдесь мы выбрали ключ сортировки с помощью предложения ORDER BY. Подробнее о ключах сортировки и о том, как их выбирать, см. здесь.
ClickHouse может загружать данные JSON в нескольких форматах, автоматически определяя тип по расширению и содержимому файла. Для чтения JSON‑файлов из приведённой выше таблицы можно воспользоваться функцией S3:
Обратите внимание, что указывать формат файла не обязательно. Вместо этого мы используем glob-шаблон для чтения всех файлов *.json.gz из бакета. ClickHouse автоматически определяет формат JSONEachRow (ndjson) по расширению и содержимому файла. Если ClickHouse не может определить формат автоматически, его можно указать вручную через параметры функций.
Сжатые файлыУказанные выше файлы также находятся в сжатом виде. ClickHouse автоматически распознаёт это и корректно их обрабатывает.
Для загрузки строк из этих файлов можно использовать INSERT INTO SELECT:
Строки также можно загружать непосредственно в запросе с помощью предложения FORMAT, например.
В этих примерах используется формат JSONEachRow. Также поддерживаются другие распространённые JSON-форматы; примеры их использования приведены здесь.

Загрузка полуструктурированного JSON

В предыдущем примере мы загружали статический JSON с заранее известными именами ключей и типами. Однако так бывает не всегда: ключи могут добавляться, а их типы — меняться. Это часто встречается, например, в данных обсервабилити. ClickHouse решает эту задачу с помощью специального типа JSON. Рассмотрим следующий пример из расширенной версии приведённого выше набора данных Python PyPI. Здесь мы добавили произвольный столбец tags со случайными парами «ключ — значение».
Столбец tags здесь имеет непредсказуемую структуру, поэтому его невозможно описать схемой. Чтобы загрузить эти данные, мы можем использовать нашу предыдущую схему, но добавить дополнительный столбец tags типа JSON:
Мы заполняем таблицу так же, как заполняли исходный набор данных:
Обратите внимание на разницу в производительности при загрузке данных. Для JSON-столбца требуется вывод типов во время вставки, а также дополнительное место для хранения, если есть столбцы с более чем одним типом. Хотя тип JSON можно настроить (см. Проектирование схемы JSON) так, чтобы его производительность была сопоставима с производительностью при явном объявлении столбцов, по умолчанию он намеренно остаётся гибким. Однако за эту гибкость приходится платить.

Когда использовать тип JSON

Используйте тип JSON, если ваши данные:
  • Содержат непредсказуемые ключи, которые со временем могут меняться.
  • Содержат значения разных типов (например, path иногда может быть строкой, а иногда — числом).
  • Требуют гибкости схемы, когда строгая типизация нецелесообразна.
Если структура ваших данных известна и стабильна, необходимость в типе JSON возникает редко, даже если сами данные представлены в формате JSON. В частности, если ваши данные имеют:
  • Плоскую структуру с известными ключами: используйте стандартные типы столбцов, например String.
  • Предсказуемую вложенность: используйте для таких структур типы Tuple, Array или Nested.
  • Предсказуемую структуру с меняющимися типами: вместо этого рассмотрите типы Dynamic или Variant.
Вы также можете комбинировать подходы, как в приведенном выше примере: использовать статические столбцы для предсказуемых ключей верхнего уровня и один JSON-столбец для динамической части полезной нагрузки.
Последнее изменение 10 июня 2026 г.