Примечания
-
Массивы: в Elasticsearch все поля изначально поддерживают массивы. В ClickHouse массивы должны быть явно определены (например,
Array(String)); их преимущество в том, что к конкретным позициям можно обращаться и выполнять по ним запросы, напримерan_array[1]. -
Мультиполя: Elasticsearch позволяет индексировать одно и то же поле несколькими способами (например, и как
text, и какkeyword). В ClickHouse такой подход нужно моделировать с помощью отдельных столбцов или представлений. -
Типы Map и JSON - в ClickHouse тип
Mapобычно используется для моделирования динамических структур ключ-значение, таких какresourceAttributesиlogAttributes. Этот тип обеспечивает гибкую ингестию без схемы, позволяя добавлять произвольные ключи во время выполнения, — по смыслу это похоже на объекты JSON в Elasticsearch. Однако важно учитывать следующие ограничения:- Единый тип значений: столбцы
Mapв ClickHouse должны иметь согласованный тип значений (например,Map(String, String)). Значения смешанных типов не поддерживаются без приведения. - Издержки производительности: доступ к любому ключу в
Mapтребует загрузки всей структурыMapв память, что может негативно сказываться на производительности. - Нет подстолбцов: в отличие от JSON, ключи в
Mapне представлены как настоящие подстолбцы, что ограничивает возможности ClickHouse по эффективному индексированию, сжатию и выполнению запросов.
Mapв пользу улучшенного типаJSONв ClickHouse. ТипJSONустраняет многие недостаткиMap:- Настоящее столбцовое хранение: каждый путь в JSON хранится как подстолбец, что обеспечивает эффективное сжатие, фильтрацию и векторизованное выполнение запросов.
- Поддержка смешанных типов: разные типы данных (например, целые числа, строки, массивы) могут сосуществовать по одному и тому же пути без приведения или унификации типов.
-
Масштабируемость файловой системы: внутренние ограничения на динамические ключи (
max_dynamic_paths) и типы (max_dynamic_types) предотвращают взрывной рост числа файлов столбцов на диске даже для наборов ключей большой мощности. -
Плотное хранение:
nullи отсутствующие значения хранятся разреженно, чтобы избежать лишних накладных расходов. ТипJSONособенно хорошо подходит для рабочих нагрузок обсервабилити, сочетая гибкость ингестии без схемы с производительностью и масштабируемостью встроенных типов ClickHouse, — это делает его идеальной заменойMapв динамических полях атрибутов. Для получения дополнительных сведений о типе JSON рекомендуем руководство по JSON и статью «How we built a new powerful JSON data type for ClickHouse».
- Единый тип значений: столбцы