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

Используйте JSON, где это уместно

ClickHouse теперь предлагает собственный тип колонки JSON, предназначенный для полуструктурированных и динамических данных. Важно уточнить, что это тип колонки, а не формат данных — вы можете вставлять JSON в ClickHouse как строку или через поддерживаемые форматы, такие как JSONEachRow, но это не значит, что следует использовать тип колонки JSON. Пользователи должны использовать тип JSON только тогда, когда структура их данных динамична, а не просто потому, что они хранят JSON.

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

Используйте тип JSON, когда ваши данные:

  • Имеют непредсказуемые ключи, которые могут изменяться с течением времени.
  • Содержат значения с различными типами (например, путь может иногда содержать строку, а иногда число).
  • Требуют гибкости схемы, где строгая типизация невозможна.

Если структура ваших данных известна и последовательна, редко возникает необходимость в типе JSON, даже если ваши данные находятся в формате JSON. В частности, если ваши данные имеют:

  • Плоскую структуру с известными ключами: используйте стандартные типы колонок, например, String.
  • Предсказуемое вложение: используйте типы Tuple, Array или Nested для этих структур.
  • Предсказуемую структуру с различными типами: рассмотрите вместо этого типы Dynamic или Variant.

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

Соображения и советы по использованию JSON

Тип JSON позволяет эффективно хранить данные колонками, выравнивая пути в подколонки. Однако с гибкостью приходит ответственность. Чтобы использовать его эффективно:

  • Указывайте типы путей с помощью подсказок в определении колонки, чтобы указать типы для известных подколонок, избегая ненужного вывода типов.
  • Пропускайте пути, если значения не нужны, используя SKIP и SKIP REGEXP, чтобы сократить объем хранилища и повысить производительность.
  • Избегайте установки max_dynamic_paths слишком высоко — большие значения увеличивают потребление ресурсов и снижают эффективность. В качестве правила, держите его ниже 10 000.
Подсказки типов

Подсказки типов предлагают больше, чем просто способ избегания ненужного вывода типов — они полностью устраняют косвенность хранения и обработки. Пути JSON с подсказками типов всегда хранятся так же, как и традиционные колонки, обходя необходимость колонок-дискриминаторов или динамического разрешения во время выполнения запросов. Это означает, что при наличии хорошо определенных подсказок типов вложенные поля JSON достигают такой же производительности и эффективности, как если бы они изначально моделировались как поля верхнего уровня. В результате для наборов данных, которые в основном последовательны, но все же выигрывают от гибкости JSON, подсказки типов предлагают удобный способ сохранения производительности без необходимости перестраивать вашу схему или конвейер приёма данных.

Расширенные функции

  • Колонки JSON могут использоваться в первичных ключах, как и любые другие колонки. Кодеки не могут быть указаны для подколонки.
  • Они поддерживают интроспекцию через функции, такие как JSONAllPathsWithTypes() и JSONDynamicPaths().
  • Вы можете читать вложенные подобъекты, используя синтаксис .^.
  • Синтаксис запросов может отличаться от стандартного SQL и может требовать специального преобразования или операторов для вложенных полей.

Для получения дополнительной информации смотрите документацию по JSON ClickHouse или ознакомьтесь с нашей публикацией в блоге Новый мощный тип данных JSON для ClickHouse.

Примеры

Рассмотрим следующий пример JSON, представляющий строку из набора данных Python PyPI:

Предположим, что эта схема статична и типы могут быть хорошо определены. Даже если данные находятся в формате NDJSON (JSON строка на строку), нет необходимости использовать тип JSON для такой схемы. Просто определите схему с классическими типами.

и вставьте строки JSON:

Рассмотрим набор данных arXiv, содержащий 2.5 миллиона научных статей. Каждая строка в этом наборе данных, распределенном в виде NDJSON, представляет собой опубликованную академическую работу. Пример строки представлен ниже:

Хотя JSON здесь сложен, с вложенными структурами, он предсказуем. Количество и тип полей не изменится. Хотя мы могли бы использовать тип JSON для этого примера, мы также можем просто явно определить структуру, используя Tuple и Nested типы:

Снова можем вставить данные как JSON:

Предположим, добавлена еще одна колонка с именем tags. Если бы это была просто массив строк, мы могли бы смоделировать как Array(String), но предположим, что пользователи могут добавлять произвольные структуры тегов с разными типами (обратите внимание, что score — это строка или целое число). Наш модифицированный JSON-документ:

В этом случае мы можем смоделировать документы arXiv либо полностью в JSON, либо просто добавить колонку JSON tags. Мы предоставляем оба примера ниже:

примечание

Мы предоставляем подсказку типа для колонки update_date в определении JSON, так как мы используем его в сортировке / первичном ключе. Это помогает ClickHouse знать, что эта колонка не будет равна null и гарантирует, что он знает, какую подколонку update_date использовать (может быть несколько для каждого типа, так что это иначе неоднозначно).

Мы можем вставить данные в эту таблицу и просмотреть схему, которая была выведена, используя функцию JSONAllPathsWithTypes и формат вывода PrettyJSONEachRow:

В качестве альтернативы мы могли бы смоделировать это, используя нашу ранее описанную схему и колонку JSON tags. Это обычно предпочтительнее, минимизируя вывод, необходимый ClickHouse:

Теперь мы можем вывести типы подколонки tags.