Слой витрин DM: форма по зерну, дележ с менти, контур DQ #147

Merged
ddmitry merged 4 commits from 135-dm-marts into main 2026-08-25 13:38:23 +03:00
Showing only changes of commit 92d834761c - Show all commits
+28 -15
View File
@@ -10,8 +10,7 @@
Витрина, меняющая зерно источника — дневной агрегат, сверка по заказам, —
материализуется: `dm.<имя>_rep` / `_dist` и публичное `dm.<имя>_v` с явным
списком колонок, по общим [конвенциям хранилища](storage.md). Наполняет её
`dm_transform` заменой дневных партиций — той же механикой, что у сущностей
DDS ([конвейер](etl.md)); объём пересборки — ниже. Витрина, сохраняющая зерно
`dm_transform`; ритм и механика пересборки — ниже. Витрина, сохраняющая зерно
источника — переименование, обогащение строки, — остаётся обычным
представлением: копию событий ради других имён колонок не держит ни один
боевой склад.
@@ -49,21 +48,27 @@ DDS ([конвейер](etl.md)); объём пересборки — ниже.
от выполненных домашек. Расширение дашборда визуализациями по своим
витринам — отдельная домашка после этапа 8.
## Объём пересборки
## Ритм пересборки
Все материализованные витрины пересобираются одним окном — дышащим окном K
от позиции мира, тем же, что у заказов. Витринам от заказов окна хватает по
построению: день за окном закрыт, его классы и суммы не меняются. Витринам
от событий и сессий окно даже избыточно — их дни замерзают сразу.
Партиция витрины пересобирается, пока может измениться её источник, —
поэтому ритмов три, по числу источников:
Одно следствие названо явно. `daily_traffic` обогащается картой
идентичностей, а карта пересчитывается целиком, и склейка ретроспективна:
покупка сегодня делает куку «известной» во всех прошлых днях карты. Дни за
окном K в витрину эту новость уже не получат — они хранят число известных
на момент закрытия окна. Это решение, а не недосмотр: живое окно показывает
текущую склейку, замороженные дни — какой она была тогда, и расхождение
между витриной и картой само по себе урок ретроспективности (историю
склейки стенд сознательно не хранит — issue #145).
- **от событий и сессий** — день замерзает сразу; пересборка догоняет
хвост несобранных дней заменой дневных партиций;
- **от заказов** — день дышит окном K и закрывается; пересборка заменяет
партиции окна, дни за ним закрыты по построению;
- **от карты идентичностей** — не замерзает никогда: склейка
ретроспективна, покупка сегодня делает куку известной во всех её прошлых
днях, а карта пересчитывается целиком.
Поэтому `daily_traffic` наследует у своего источника и ритм, и механику:
полный пересчёт всех дней каждый прогон в `ReplacingMergeTree(_load_ts)`,
как у самой карты. Дневные партиции ей не положены — строка в дне одна, и
партиция на строку плодила бы микрокуски на ровном месте. Пересчёт дешёв:
витрина читает сессии и карту локальным соединением по ключу ко-локации.
Пересчитывать точечно только затронутые дни не из чего: для этого надо
знать, какие связки новые, а полный пересчёт карты этот след затирает —
восстановление следа оставлено лабе повышенной сложности (issue #149).
## `dm.dq_summary`
@@ -128,6 +133,14 @@ Airflow. Партиция — день данных; прогон звена DQ
расшифровывать. Красное «ещё не построено» честнее.
- **Самопроверка пишет в `dq_summary`.** Попытки менти смешались бы с
историей качества конвейера.
- **Окно K для `daily_traffic` — прошлое замерзает.** Дни за окном хранили
бы число известных на момент закрытия — витрина тихо расходится с картой
и протаскивает обратно «знание на дату», отвергнутое развилкой карты
(#133).
- **Инкрементальный пересчёт затронутых дней по `first_matched_at`.**
Производственный ход, но на объёмах стенда он экономит неизмеримое, а
след новых связок требует вернуть колонку, выкинутую в #133. Стал лабой
повышенной сложности — issue #149.
- **Superset поверх DDS без слоя DM.** Терялся бы урок «витрина — контракт
под потребителя», против раздела 7 спеки.