ClickHouse: Как правильно хранить данные JSON?
Я собираюсь перенести данные из базы данных PostgreSQL в ClickHouse Яндекса. Одно из полей в исходной таблице имеет тип JSON и называется
additional_data
. Итак, PostgreSQL позволяет мне получить доступ к атрибутам столбца json во время, например,
SELECT ...
запросы с
->>
и
->
и так далее.
Мне нужно, чтобы такое же поведение сохранялось в моей результирующей таблице в хранилище ClickHouse. (т.е. доступность атрибутов JSON и It во время выборочных запросов и с использованием предложений фильтрации и агрегирования)
Вот что я сделал во время
CREATE TABLE ...
в клиенте ClickHouse:
create table if not exists analytics.events
(
uuid UUID,
...,
created_at DateTime,
updated_at DateTime,
additional_data Nested (
message Nullable(String),
eventValue Nullable(String),
rating Nullable(String),
focalLength Nullable(Float64)
)
)
engine = MergeTree
ORDER BY (uuid, created_at)
PRIMARY KEY uuid;
Это хороший выбор для хранения сериализуемых данных в формате JSON? Есть идеи?
Возможно, лучше хранить данные JSON в виде простого
String
вместо
Nested
и играть с ним с помощью специальных функций?
2 ответа
Хотя ClickHouse использует для анализа быстрые библиотеки JSON (такие как simdjson и rapidjson), я думаю, что поля Nesting должны быть быстрее.
Если структура JSON зафиксирована или может быть изменена предсказуемо, попробуйте рассмотреть способ денормализации данных:
..
created_at DateTime,
updated_at DateTime,
additional_data_message Nullable(String),
additional_data_eventValue Nullable(String),
additional_data_rating Nullable(String),
additional_data_focalLength Nullable(Float64)
..
С одной стороны, это может значительно увеличить количество строк и дискового пространства, с другой стороны, это должно дать значительный прирост производительности (особенно при правильной индексации). Более того, размер диска можно уменьшить с помощью типа LowCardinality и кодеков.
- Некоторые другие замечания:
избегайте использования типов, допускающих значение NULL, предпочитайте использовать некоторые замены, такие как '', 0 и т. д. (см. объяснение использования диска в строковом поле Clickhouse: null vs empty)
Тип UUID не дает монотонности индекса, этот должен быть намного лучше ( Еще секреты производительности запросов ClickHouse):
..
ORDER BY (created_at, uuid);
- рассмотрите возможность использования агрегатных движков, чтобы значительно увеличить скорость вычисления агрегированных значений
- В любом случае перед принятием окончательного решения необходимо провести ручное тестирование на подмножестве данных (это касается выбора схемы (json как строка / вложенный тип / денормализованный способ), как выбора кодека столбца).
По состоянию на 22.3 существует
JSON
тип данных https://clickhouse.com/blog/clickhouse-newsletter-april-2022-json-json-json/