Пример: Мы будем использовать фиктивный набор данных с количеством просмотров в час для набора доменных имён. Наша цель
- Нам нужны данные, агрегированные по месяцам для каждого доменного имени,
- Нам также нужны данные, агрегированные по годам для каждого доменного имени.
- Писать запросы, которые будут читать и агрегировать данные во время выполнения SELECT-запроса
- Подготовить данные во время приёма в новом формате
- Подготовить данные во время приёма в виде определённой агрегации.
Исходная таблица для materialized views
Null.
Вы можете создать materialized view на таблице Null. Тогда данные, записываемые в таблицу, будут влиять на materialized view, но исходные необработанные данные по-прежнему будут отбрасываться.
Ежемесячная aggregated table и materialized view
Target; в этом примере это будет analytics.monthly_aggregated_data, где мы будем хранить сумму просмотров по месяцам и доменным именам.
Ежегодно агрегированная таблица и materialized view
monthly_aggregated_data.
Сначала мы создадим новую целевую таблицу, в которой будет храниться суммарное количество просмотров, агрегированное по годам для каждого доменного имени.
FROM будет использовать таблицу monthly_aggregated_data, то есть поток данных будет таким:
- Данные поступают в таблицу
hourly_data. - ClickHouse перенаправит полученные данные в первую materialized view —
monthly_aggregated_data, - Наконец, данные, полученные на шаге 2, будут перенаправлены в
year_aggregated_data.
Распространённое заблуждение при работе с materialized view состоит в том, что данные читаются из таблицы.
Materialized views работают не так: пересылается не итоговый результат в таблице, а вставленный блок данных.Представим, что в этом примере в monthly_aggregated_data используется движок CollapsingMergeTree. Данные, передаваемые в наше второе materialized view year_aggregated_data_mv, не будут итоговым результатом схлопнутой таблицы; будет передан блок данных с полями, определёнными в SELECT ... GROUP BY.Если вы используете CollapsingMergeTree, ReplacingMergeTree или даже SummingMergeTree и планируете создать каскадное materialized view, вам нужно понимать описанные здесь ограничения.Пример данных
analytics.hourly_data, то увидите следующее, потому что движок таблицы — Null, хотя данные были обработаны.
Результаты
sumCountViews, то увидите бинарное представление (в некоторых терминалах), поскольку значение хранится не как число, а как тип AggregateFunction.
Чтобы получить итоговый результат агрегации, следует использовать суффикс -Merge.
Специальные символы, хранящиеся в AggregateFunction, можно увидеть с помощью этого запроса:
Merge, чтобы получить значение sumCountViews:
AggregatingMergeTree мы определили AggregateFunction как sum, поэтому можем использовать sumMerge. Если в AggregateFunction используется функция avg, то следует использовать avgMerge, и так далее.
monthly_aggregated_data, мы можем получить агрегированные по месяцам данные для каждого доменного имени:
Объединение нескольких исходных таблиц в одну целевую таблицу
UNION ALL.
Сначала создайте две исходные таблицы, представляющие разные наборы метрик:
Target с объединённым набором метрик:
Target. Отсутствующие столбцы не нужно указывать явно:
Target:
Target: