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

AggregatingMergeTree

Этот движок наследуется от MergeTree, изменяя логику слияния частей данных. ClickHouse заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым ключом сортировки) одной строкой (внутри одной части данных), которая хранит комбинацию состояний агрегирующих функций.

Вы можете использовать таблицы AggregatingMergeTree для инкрементной агрегации данных, включая агрегированные материализованные представления.

Вы можете увидеть пример использования AggregatingMergeTree и агрегирующих функций в приведенном ниже видео:

Движок обрабатывает все колонки со следующими типами:

AggregateFunction

SimpleAggregateFunction

Использование AggregatingMergeTree уместно, если это уменьшает количество строк на порядки.

Создание таблицы

Для описания параметров запроса смотрите описание запроса.

Классы запросов

При создании таблицы AggregatingMergeTree требуются те же классы, что и при создании таблицы MergeTree.

Устаревший метод создания таблицы
примечание

Не используйте этот метод в новых проектах и, если возможно, переключите старые проекты на описанный выше метод.

Все параметры имеют такое же значение, как в MergeTree.

SELECT и INSERT

Чтобы вставить данные, используйте INSERT SELECT запрос с агрегирующими функциями -State-. При выборке данных из таблицы AggregatingMergeTree используйте оператор GROUP BY и такие же агрегирующие функции, как и при вставке данных, добавляя суффикс -Merge.

В результатах запроса SELECT значения типа AggregateFunction имеют конкретное бинарное представление для всех форматов вывода ClickHouse. Например, если вы выгружаете данные в формате TabSeparated с помощью запроса SELECT, то этот дамп можно загрузить обратно с помощью запроса INSERT.

Пример агрегированного материализованного представления

Следующий пример предполагает, что у вас есть база данных с именем test, так что создайте ее, если она еще не существует:

Теперь создайте таблицу test.visits, которая содержит сырые данные:

Далее вам нужна таблица AggregatingMergeTree, которая будет хранить AggregationFunction, отслеживающие общее количество визитов и количество уникальных пользователей.

Создайте материализованное представление AggregatingMergeTree, которое следит за таблицей test.visits и использует тип AggregateFunction:

Создайте материализованное представление, которое заполняет test.agg_visits из test.visits:

Вставьте данные в таблицу test.visits:

Данные вставляются как в test.visits, так и в test.agg_visits.

Чтобы получить агрегированные данные, выполните запрос, такой как SELECT ... GROUP BY ... из материализованного представления test.mv_visits:

Добавьте еще пару записей в test.visits, но на этот раз попробуйте использовать другую метку времени для одной из записей:

Снова выполните запрос SELECT, который вернет следующий результат: