Описание
Все агрегатные функции в ClickHouse имеют зависящее от реализации промежуточное состояние, которое можно сериализовать в тип данныхAggregateFunction и сохранить в таблице. Обычно это делается
с помощью materialized view.
С типом AggregateFunction обычно используются два комбинатора агрегатных функций:
- Комбинатор агрегатной функции
-State, который при добавлении к имени агрегатной функции создает промежуточные состоянияAggregateFunction. - Комбинатор агрегатной функции
-Merge, который используется для получения итогового результата агрегации из промежуточных состояний.
Синтаксис
aggregate_function_name- Имя агрегатной функции. Если функция параметризованная, следует также указать её параметры.types_of_arguments- Типы аргументов агрегатной функции.
Использование
Вставка данных
Чтобы вставить данные в таблицу со столбцами типаAggregateFunction, можно
использовать INSERT SELECT с агрегатными функциями и
комбинатором агрегатной функции
-State.
Например, для вставки в столбцы типа AggregateFunction(uniq, UInt64) и
AggregateFunction(quantiles(0.5, 0.9), UInt64) следует использовать следующие
агрегатные функции с комбинаторами.
uniq и quantiles, uniqState и quantilesState
(с добавленным комбинатором -State) возвращают состояние, а не итоговое значение.
Иными словами, они возвращают значение типа AggregateFunction.
В результатах запроса SELECT значения типа AggregateFunction имеют
зависящее от реализации двоичное представление во всех выходных
форматах ClickHouse.
Существует специальная настройка уровня сеанса aggregate_function_input_format, которая позволяет строить состояние из входных значений.
Она поддерживает следующие форматы:
state- сериализованное состояние (по умолчанию). Если вы выгружаете данные, например, в форматTabSeparatedс помощью запросаSELECT, то этот дамп можно загрузить обратно с помощью запросаINSERT.value- формат ожидает одно значение аргумента агрегатной функции или, в случае нескольких аргументов, их кортеж; это значение агрегируется для формирования состояния.array- формат ожидает Array значений, как описано выше для вариантаvalue; все элементы массива агрегируются для формирования состояния.
value и array столбец читается так, как если бы он имел тип значений (T, Tuple(T1, T2) или Array из них),
в том представлении, которое входной формат использует для этого типа. Это работает одинаково во всех входных форматах, от CSV и JSONEachRow до RowBinary и Parquet.
Выбор данных
При выборке данных из таблицыAggregatingMergeTree используйте предложение GROUP BY
и те же агрегатные функции, что и при вставке данных, но с
комбинатором -Merge.
Агрегатная функция с добавленным к ней комбинатором -Merge принимает набор
состояний, объединяет их и возвращает результат полной агрегации данных.
Например, следующие два запроса возвращают один и тот же результат:
Пример использования
См. описание движка AggregatingMergeTree.Материалы по теме
- Блог: Использование агрегатных комбинаторов в ClickHouse
- Комбинатор MergeState.
- Комбинатор State.