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 ответа

  1. Хотя ClickHouse использует для анализа быстрые библиотеки JSON (такие как simdjson и rapidjson), я думаю, что поля Nesting должны быть быстрее.

  2. Если структура 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 и кодеков.

  1. Некоторые другие замечания:
       ..
ORDER BY (created_at, uuid);
  • рассмотрите возможность использования агрегатных движков, чтобы значительно увеличить скорость вычисления агрегированных значений
  1. В любом случае перед принятием окончательного решения необходимо провести ручное тестирование на подмножестве данных (это касается выбора схемы (json как строка / вложенный тип / денормализованный способ), как выбора кодека столбца).

По состоянию на 22.3 существует JSONтип данных https://clickhouse.com/blog/clickhouse-newsletter-april-2022-json-json-json/

Другие вопросы по тегам