feat(ods): версией заказа стала дата слепка, окно DDS — из данных
- Зачем:
- ярлык snapshot_date выжившей строки доставался жребием, а объём
пересборки DDS держался на константе окна с двумя несверяемыми копиями
(ADR 0014, развилка #163).
- Что:
- ods.order_rep переведена на ReplacingMergeTree(snapshot_date): выживает
строка позднейшего слепка, ярлык стал правдивым.
- order_scope.sql выводит окно из дней последнего слепка; ORDER_WINDOW_DAYS
и параметр window_days сняты со стенда, мёртвая защита краем источника
убрана.
- документы и комментарии SQL приведены к ADR 0014: роль ODS, условие
«одна дата — один слепок», объём прогона и слепые пятна конвейера.
- Проверка:
- make lint; make rebuild-storage, затем make smoke, make check-clickhouse,
make check-services — зелёные.
- после двух слепков snapshot_date всех 1917 строк ods.order_v равен
последнему слепку заказа, расхождений ноль; деловые поля построчно
совпали с эталоном argMax по updated_at из сырья.
- dds_transform без K: первый прогон 06-01…06-07, после нового дня мира
06-02…06-08, повтор прогона содержимого не изменил.
Closes #165
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
650efacc3f
commit
a82c75705d
13 files changed
+140
-141
No files matched your search
+12
-10
@@ -156,17 +156,19 @@ ENGINE = Distributed('clickstream_cluster', 'ods', 'event_errors_rep', cityHash6
|
||||
-- Слепок привозит состояние заказов окна изменяемости, а не поток изменений,
|
||||
-- и одна и та же сущность приезжает в нём много дней подряд. Поэтому строка
|
||||
-- здесь — версия заказа, а не запись слепка: ключ сущности order_id, колонка
|
||||
-- версии updated_at (время последнего изменения строки в источнике). Порядок
|
||||
-- версий решает источник, а не хранилище.
|
||||
-- версии snapshot_date — день, состояние которого снял источник. У полного
|
||||
-- слепка версия и есть слепок: истинно то, что источник сказал последним
|
||||
-- (ADR 0014).
|
||||
--
|
||||
-- Четыре координаты отвечают на разные вопросы, и путать их нельзя:
|
||||
-- updated_at — какая бизнес-версия новее; snapshot_date — в слепке какого
|
||||
-- модельного дня источник показал строку; _load_id — какой запуск Airflow её
|
||||
-- принял; _load_ts — когда она приехала в хранилище. Ключом сущности не
|
||||
-- становится ни одна из трёх последних: они про наблюдение и загрузку. Версию
|
||||
-- выбирает только updated_at, поэтому у выжившей после схлопывания строки
|
||||
-- snapshot_date — один из дней, когда источник показывал эту версию, не
|
||||
-- обязательно последний (docs/architecture/orders/ingestion.md).
|
||||
-- snapshot_date — в слепке какого модельного дня источник показал строку;
|
||||
-- updated_at — когда строку последний раз меняли в источнике; _load_id —
|
||||
-- какой запуск Airflow её принял; _load_ts — когда она приехала в хранилище.
|
||||
-- Ключом сущности не становится ни одна: заказ один, а дней наблюдения и
|
||||
-- версий у него много. Схлопывание оставляет строку позднейшего слепка,
|
||||
-- поэтому snapshot_date выжившей — последний день, когда источник показывал
|
||||
-- заказ, и по нему DDS читает объём пересборки
|
||||
-- (docs/architecture/orders/ingestion.md).
|
||||
--
|
||||
-- PARTITION BY toDate(created_at) — по дню создания строки в источнике. Он
|
||||
-- неизменен у всех версий заказа, поэтому версии лежат в одной партиции и
|
||||
@@ -194,7 +196,7 @@ CREATE TABLE IF NOT EXISTS ods.order_rep ON CLUSTER clickstream_cluster
|
||||
_load_id String,
|
||||
_load_ts DateTime64(3, 'UTC')
|
||||
)
|
||||
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/{database}/{table}', '{replica}', updated_at)
|
||||
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/{database}/{table}', '{replica}', snapshot_date)
|
||||
PARTITION BY toDate(created_at)
|
||||
ORDER BY order_id;
|
||||
|
||||
|
||||
Reference in new issue
Block a user