feat(dds): добавлена модель заказа и пересборка окна заменой партиций

Зачем:
- Дать слою первую физическую сущность и показать идемпотентность, устроенную
  иначе, чем в приёме: заменой партиции, а не колонкой версии.
- Родить механику дневной пересборки на кластере — образец для сессий и витрин.

Что:
- Добавлены dds.order_rep/_dist, двойник-донор dds.order_stage_rep/_dist и
  публичный договор dds.order_v с разбором позиций в три массива.
- Добавлены запросы объёма прогона, сборки в двойник и замены партиции по дню.
- Добавлен даг dds_transform: группа задач order, замена — размноженной задачей.
- Окно изменяемости K пришло на сторону стенда якорем compose; владелец числа
  остаётся у генератора.
- Объём считается от позднейшего дня заказа и первого недостающего дня: ярлыки
  доставки ODS для этого непригодны, а максимум собранного дня прячет дыры.
- Записано, чего конвейер о себе не знает, и адресовано контуру DQ.

Проверка:
- make lint
- make smoke, make check-clickhouse, make check-services
- Прогон по стартовому миру: 1917 заказов, счёт равен ods.order_v, каждый заказ
  на шарде своего cityHash64(order_id), сумма позиций равна items_total.
- Повтор без нового слепка: содержимое то же, _load_id новый; после слепка
  пересобрано окно, день за окном не тронут.
- Снесённая руками партиция 2026-06-01 восстановлена побайтово.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
ddadminandClaude Opus 5 committed 2026-08-26 05:20:39 -04:00
1 parent 96829718f9
commit 1e8b83ffbb
9 files changed
+555 -6

No files matched your search

+11
View File
@@ -48,6 +48,16 @@ x-kafka-target: &kafka-target
x-world-starting-days: &world-starting-days "8"
# Окно изменяемости заказа: слепок бэкенда несёт заказы последних K дней, за
# окном заказ замерзает. Число принадлежит модельному миру, и владелец у него
# один — generator/world.py (ORDER_WINDOW_DAYS): сделать окно настройкой
# генератора значило бы разрешить менять физику мира снаружи, а опись мира
# держится на её неизменности. Стенду копия нужна затем, что по этому же числу
# трансформация DDS решает, какие дни пересобирать. Разойдутся — пересборка
# промахнётся по краю окна, и заметит это не проверка, а менти со вчерашней
# выручкой.
x-order-window-days: &order-window-days "7"
x-airflow-common: &airflow-common
image: clickstream-airflow:local
build:
@@ -77,6 +87,7 @@ x-airflow-common: &airflow-common
STAND_NETWORK: ${COMPOSE_PROJECT_NAME}_default
WORLD_STARTING_DAYS: *world-starting-days
KAFKA_ORDERS_TOPIC: *orders-topic
ORDER_WINDOW_DAYS: *order-window-days
volumes:
- ./dags:/opt/airflow/dags:ro
# Запросы дагов: даг называет файл, а обработчик DAG при разборе загружает