@softshape

Как правильно агреггировать данные в ClickHouse?

Мы планируем поднять ClickHouse для быстрого построения отчетов за большие периоды - год и т.п. Минимальная единица для отчета - день, поэтому хранить в нем предполагается агреггированные данные за каждый день. Вопрос как поступить, если отчет делается за несколько дней, включая сегодня. Сегодняшние данные - это PostgreSQL и они накапливаются в течение дня.

1. Два запроса, за прошлые даты в ClickHouse, за сегодня в PostgeSQL, результат соединять?
2. Хранить агреггированные данные в ClickHouse и за сегодня тоже, обновлять их по мере поступления?
3. Что-то еще?

Первый способ громоздкий, второй - неудобный для ClickHouse, там нет нормального обновления данных.
  • Вопрос задан
  • 303 просмотра
Пригласить эксперта
Ответы на вопрос 1
Borellius
@Borellius
Разработчик.
Не понимаю зачем в этой связке нужен постгрес.
Пишете в кликхауз в таблицу сырые данные/события.
Делаете нужные materialized views.

CREATE TABLE events (
    requestId String,
    userId UInt16,
    siteId UInt16, 
    type String,
    pubCut Float,
    createdAt Date
) ENGINE = MergeTree() PARTITION BY createdAt 
ORDER BY 
  (requestId, createdAt);


CREATE MATERIALIZED VIEW mv_overall_data ENGINE = AggregatingMergeTree() 
ORDER BY 
  (date, siteId, userId) POPULATE AS 
SELECT 
  toDayOfMonth(createdAt) as date, 
  siteId, 
  userId, 
  countStateIf(type = 'i') as impressions, 
  countStateIf(type = 'c') as clicks, 
  sumState(pubCut) as earnings 
FROM 
  events 
GROUP BY 
  (date, siteId, userId)


Далее запрашиваем это дело
SELECT 
						date as group_by,
						countMerge(impressions) AS ad_impressions,
						countMerge(clicks) AS ad_clicks,
						sumMerge(earnings) AS ad_earnings
					FROM
						default.mv_overall_data
					GROUP BY
						date


как то так...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы