Витрины стенда: даг dm_transform, revenue_daily и daily_traffic #154
Notifications
Due Date
No due date set.
Blocks
Depends on
#155 Сверка purchase против заказов: dm.purchase_vs_orders (A+C)
ddmitry/clickstream-data-platform
#156 Конвейер etl_pipeline: сцепка дагов и пути запуска
ddmitry/clickstream-data-platform
#159 Учебные задания витрин DM и даг самопроверки
ddmitry/clickstream-data-platform
#152 Сессии: dds.session и нарезка визитов
ddmitry/clickstream-data-platform
#153 Карта идентичностей: dds.identity_map и полный пересчёт
ddmitry/clickstream-data-platform
Reference: ddmitry/clickstream-data-platform#154
Reference in new issue
Block a user
Part of #6.
Цель
Слой DM рождается: база
dm, дагdm_transformи два ритма пересборки надвух витринах —
revenue_daily(окно K заменой партиций) иdaily_traffic(полный пересчёт вслед за картой). Учебный результат(dm.md): форма витрины — решение по роли; пересборка агрегатов
конвейером — производственный паттерн, ради которого слой и строится.
Что войдёт
dmвsql/ddl/00-databases.sql(карта таблиц её обещает, DDLпока не создаёт).
dm.revenue_daily_rep/_dist/_v: состав — спека §7(
report_date,product_categoryчерезdictGetкаталога +ARRAY JOINпозиций,orders,units,revenue,aov; толькозаказы
paid); ритм — от заказов: замена партиций окна K. Ключшардирования решается вместе с DDL — по правилу партиции-донора
storage.md.
dm.daily_traffic_rep/_dist/_v: пара «посетители / известные»;источники — сессии и карта идентичностей, локальное соединение по ключу
ко-локации;
ReplacingMergeTree(_load_ts)без партиций, полныйпересчёт каждый прогон (ритм от карты, dm.md). Точную форму локального
обогащения через публичные
_vпроверить эмпирически — пункт спеки §11уходит из списка тем же PR; если локальность через
_vне выходит —вопрос владельцу, не тихая замена на физические объекты.
daily_trafficчитает сессии икарту, не события (dm.md) — поправить тем же PR.
dm_transformпо образцу слойных: без расписания, один активныйпрогон; имя задачи — имя витрины (
revenue_daily,daily_traffic);задачи витрин менти добавятся их ТЗ.
bi_readerпереводится сSELECT ON dm.*на явные
_v— по образцу DDS; дальше тикеты DM добавляют свои.Таблица DDL-файлов в storage.md — тем же PR.
_dist— с осознаннымparallel_distributed_insert_select.Границы
purchase_vs_orders— свой тикет;dq_summary— тикет контураDQ; учебные витрины — тикет ТЗ;
etl_pipeline— тикет конвейера (покаdm_transformзапускается рукой).Кому что
DDL и SQL витрин — Opus:
revenue_daily— образец, на который будутссылаться ТЗ менти. Codex — опыты ритмов по брифу: день за окном не
тронут, полный пересчёт не плодит дублей в
_v.Сначала прочитать
daily_traffic;Проверка
make lint,make config-test; на стендеmake smoke,make check-clickhouseиmake check-services(родился даг) зелёные.revenue_daily: все меры дня (orders,units,revenue,aov)равны прямым агрегатам по
dds.order_vсо статусомpaid.меняются, дни за окном — нет.
daily_traffic: обе меры дня равны прямым агрегатам по источникам —посетители по
dds.session_v, известные после склейки сdds.identity_map_v; покупка куки делает её известной во всех еёпрошлых днях (ретроспективность склейки).
_vобеих витрин без измененийи без дублей.
bi: оба новых_vчитаются, запись запрещена, STG недоступен.Дополнение к постановке после #150 и #165
Этот комментарий уточняет места основного текста, которые устарели после более поздних решений. Остальная постановка, границы и проверки сохраняются.
Доступ
bi_readerПункт о переводе
bi_readerсSELECT ON dm.*на отдельные_vи критерий отказа на_rep/_distбольше не действуют. При исполнении #150 проверено ограничение ClickHouse для представлений надDistributed, после чего ADR 0007 закрепил широкое право:bi_readerчитает ODS, DDS и DM, а публичную поверхность задают договор_v, документация и ревью, не гранты.Для #154 это означает:
GRANT SELECT ON dm.*остаётся без изменений; отдельных грантов на новые представления не требуется;dm.revenue_daily_vиdm.daily_traffic_v;bi: оба новых_vчитаются, запись запрещена, STG по-прежнему недоступен; отказ на_repи_distне проверяется.Объём пересборки
revenue_dailyПосле #165 константы K на стороне стенда нет. Под словами «окно K» в основном тексте следует понимать дни последнего слепка, состояние которых источник ещё может изменить. Границы берутся из наблюдаемого в ODS последнего
snapshot_date, по тому же правилу, что вsql/dds/order_scope.sql;world_positionи копия числа K для этого не используются. Сам агрегат читает толькоdds.order_v: обращение к ODS нужно лишь задаче объёма, чтобы назвать изменяемый отрезок. Первый прогон дополнительно строит всю доступную историю заказов.Договор
dm.revenue_daily_vЗерно —
report_date×product_category. Деловые колонки и их смысл:report_date—dds.order_v.order_date;product_category— категорияitem_skuизdic.products;orders— число уникальных оплаченных заказов, в которых есть позиция категории;units— суммаitem_quantityпозиций категории;revenue— суммаitem_price × item_quantityэтих позиций;discount,deliveryи общийtotalзаказа по категориям не распределяются;aov—revenue / ordersв том же срезе, денежный результат с двумя знаками после запятой.Массивы позиций разворачиваются синхронно, один заказ с несколькими позициями одной категории считается в
ordersодин раз. Публичное_vперечисляет эти колонки и_load_id,_load_tsявно.Договор
dm.daily_traffic_vЗерно — один день, без измерений, унаследованных от витрины предшественника. Деловые колонки:
report_date—dds.session_v.session_date;visitors—uniqExact(client_id)среди сессий дня;known_users—uniqExact(user_id)после обогащения сессий полной текущейdds.identity_map_v.Соединение сохраняет анонимные сессии: отсутствие пары в карте не исключает посетителя. Несколько кук одного человека увеличивают
visitors, но дают одногоknown_user. Поэтомуknown_users <= visitors, а новая покупка ретроспективно меняет прошлые дни при следующем полном пересчёте. Публичное_vперечисляетreport_date, обе меры и_load_id,_load_tsявно.Эмпирическая проверка локального соединения через публичные
_vостаётся такой, как записано в задаче: если нужная локальность через них не получается, исполнение останавливается у владельца; физические объекты молча не подставляются.