Загрузка JSON
Следующие примеры предоставляют очень простой пример загрузки структурированных и полуструктурированных данных JSON. Для более сложного JSON, включая вложенные структуры, смотрите руководство Проектирование схемы JSON.
Загрузка структурированного JSON
В этом разделе мы предполагаем, что данные JSON находятся в формате NDJSON
(JSON с разделителями строк), известном как JSONEachRow
в ClickHouse, и имеют хорошую структуру, т.е. имена колонок и типы фиксированы. NDJSON
является предпочтительным форматом для загрузки JSON благодаря своей краткости и эффективному использованию пространства, но также поддерживаются и другие форматы для входа и выхода.
Рассмотрим следующий пример JSON, представляющий строку из набор данных Python PyPI:
Для того чтобы загрузить этот объект JSON в ClickHouse, необходимо определить схему таблицы.
В этом простом случае наша структура статична, наши имена колонок известны, и их типы хорошо определены.
Хотя ClickHouse поддерживает полуструктурированные данные через тип JSON, где имена ключей и их типы могут быть динамическими, это здесь не требуется.
В случаях, когда ваши колонки имеют фиксированные имена и типы, и новые колонки не ожидаются, всегда предпочтительнее статически определенная схема в производстве.
Тип JSON предпочтителен для высоко динамичных данных, где имена и типы колонок могут меняться. Этот тип также полезен при прототипировании и исследовании данных.
Простая схема для этого показана ниже, где ключи JSON сопоставляются с именами колонок:
Мы выбрали здесь ключ упорядочения через условие ORDER BY
. Для получения дополнительной информации о ключах упорядочения и том, как их выбирать, смотрите здесь.
ClickHouse может загружать данные JSON в нескольких форматах, автоматически определяя тип по расширению и содержимому. Мы можем читать JSON-файлы для вышеуказанной таблицы, используя функцию S3:
Обратите внимание, что нам не требуется указывать формат файла. Вместо этого мы используем шаблон для чтения всех файлов *.json.gz
в корзине. ClickHouse автоматически определяет, что формат — это JSONEachRow
(ndjson) на основе расширения файла и его содержимого. Формат можно указать вручную через параметры функций, если ClickHouse не может его определить.
Вышеупомянутые файлы также сжаты. Это автоматически определяется и обрабатывается ClickHouse.
Для загрузки строк из этих файлов мы можем использовать INSERT INTO SELECT
:
Строки также могут быть загружены инлайн с использованием FORMAT
clause например:
Эти примеры предполагают использование формата JSONEachRow
. Поддерживаются и другие общие форматы JSON, примеры загрузки которых приведены здесь.
Загрузка полуструктурированного JSON
Наш предыдущий пример загружал JSON, который был статичным с известными именами ключей и типами. Однако это часто не так — ключи могут быть добавлены или их типы могут измениться. Это распространено в таких случаях, как данные наблюдаемости.
ClickHouse обрабатывает это через специализированный тип JSON
.
Рассмотрим следующий пример из расширенной версии вышеупомянутого набора данных Python PyPI. Здесь мы добавили произвольный столбец tags
с случайными парами ключ-значение.
Столбец tags здесь непредсказуем и, следовательно, невозможно его смоделировать. Для загрузки этих данных мы можем использовать нашу предыдущую схему, но предоставить дополнительный столбец tags
типа JSON
:
Мы заполняем таблицу, используя тот же подход, что и для исходного набора данных:
Обратите внимание на разницу в производительности при загрузке данных. Столбец JSON требует определения типа во время вставки, а также дополнительного хранилища, если существуют колонки с более чем одним типом. Хотя тип JSON можно настроить (см. Проектирование схемы JSON) для эквивалентной производительности с явным объявлением колонок, он специально предназначен для гибкости «из коробки». Однако эта гибкость имеет свои затраты.
Когда использовать тип JSON
Используйте тип JSON, когда ваши данные:
- Имеют непредсказуемые ключи, которые могут изменяться со временем.
- Содержат значения с варьируемыми типами (например, путь может иногда содержать строку, иногда число).
- Требуют гибкости схемы, когда строгая типизация невозможна.
Если структура ваших данных известна и последовательна, редко возникает необходимость в типе JSON, даже если ваши данные находятся в формате JSON. В частности, если ваши данные имеют:
- Плоскую структуру с известными ключами: используйте стандартные типы колонок, например, String.
- Предсказуемую вложенность: используйте типы Tuple, Array или Nested для этих структур.
- Предсказуемую структуру с варьируемыми типами: рассмотрите возможность использования типов Dynamic или Variant.
Вы также можете смешивать подходы, как мы сделали в приведенном примере, используя статические колонки для предсказуемых ключей верхнего уровня и один JSON-столбец для динамической части полезной нагрузки.