docs(ingestion): упрощены объяснения источников и приема данных
Зачем: помочь начинающему инженеру проследить событие и версию заказа от генератора до хранилища, включая ошибки и повторные поступления. Что: обновлены вводная генератора, справочники приема и модели заказа, разделы хранилища и комментарии SQL и дага. Сохранены технические условия; исполняемый код, схемы и поведение стенда не изменены. Проверка: make lint, git diff --check, 142 локальные ссылки и справка CLI. SQL без комментариев и Python AST без строк документации совпали с исходными. Генерация данных и сброс состояния не выполнялись. Refs #250
This commit is contained in:
1 parent
83434102d5
commit
75f28fe99f
13 files changed
+663
-974
No files matched your search
+16
-37
@@ -1,37 +1,17 @@
|
||||
-- DDS: объём пересборки заказов — с какого дня по какой собирает этот запуск.
|
||||
-- Дни пересборки заказов: first_day и last_day, обе границы включены.
|
||||
-- Текущее окно — дни оформления заказов из последнего snapshot_date.
|
||||
-- Если в DDS нет дня, который есть в ODS, отрезок расширяется до первого
|
||||
-- такого дня. Это восстанавливает пропуски даже за пределами текущего окна.
|
||||
--
|
||||
-- Параметров у дага нет: объём он выводит сам из состояния слоёв
|
||||
-- (docs/architecture/etl.md, «Объём прогона»). Ответ — две даты, границы
|
||||
-- непрерывного отрезка; список дней между ними разворачивает даг. Пустой
|
||||
-- источник даёт пустой ответ, и даг на нём останавливается с внятной ошибкой
|
||||
-- вместо зелёного прогона, собравшего ничего.
|
||||
-- Дата слепка у актуальной версии показывает последнее наблюдение заказа
|
||||
-- (ADR 0014). Поэтому окно берется из данных, без копирования константы
|
||||
-- генератора. FINAL здесь не нужен: created_at одинаков у всех версий,
|
||||
-- а строки последнего слепка сохраняются при слияниях.
|
||||
--
|
||||
-- Файл кончается без точки с запятой: даг читает его целиком и шлёт одним
|
||||
-- запросом, дописывая формат ответа, — точка с запятой сделала бы из этого
|
||||
-- мультизапрос, который ClickHouse не принимает.
|
||||
--
|
||||
-- Объём складывается из двух частей. Первая — дышащее окно: дни, которые нёс
|
||||
-- последний слепок, то есть те, чьё состояние источник ещё может изменить.
|
||||
-- Вторая — хвост от первого дня, которого в слое нет: первая сборка застаёт
|
||||
-- слой пустым и собирает весь стартовый мир, а после разгона мира пачкой слой
|
||||
-- догоняет уехавший вперёд источник.
|
||||
--
|
||||
-- **Хвост считается от первого недостающего дня, а не от последнего
|
||||
-- собранного.** Разница не косметическая: замены партиций идут отдельными
|
||||
-- задачами и падают порознь, поэтому упавший день оставляет дыру, пока
|
||||
-- соседние дни собираются дальше. Считай мы прогресс по максимуму собранного
|
||||
-- дня, дыра позади окна не заросла бы никогда, а прогоны продолжали бы
|
||||
-- зеленеть над щербатым слоем. Цена честного ответа — проход по дню заказа
|
||||
-- в ODS.
|
||||
--
|
||||
-- Окно читается из ярлыка слепка, а не вычисляется вычитанием окна
|
||||
-- изменяемости: у выжившей строки snapshot_date — последний слепок, который
|
||||
-- нёс этот заказ (ADR 0014). Поэтому оба края окна знает сам источник, а
|
||||
-- копии его константы на стороне стенда больше нет.
|
||||
--
|
||||
-- FINAL не нужен ни здесь, ни ниже: время рождения заказа у всех его версий
|
||||
-- одно, а строки последнего слепка несут максимум колонки версии — мерж
|
||||
-- оставляет как раз их.
|
||||
-- Пустой ODS не дает строки результата; даг завершится ошибкой.
|
||||
-- Точка с запятой в конце не нужна: клиент дописывает FORMAT ответа.
|
||||
-- Порядок пересборки — docs/architecture/etl.md, «Объём прогона».
|
||||
|
||||
WITH
|
||||
(SELECT max(snapshot_date) FROM ods.order_dist) AS last_snapshot,
|
||||
(
|
||||
@@ -44,10 +24,9 @@ WITH
|
||||
FROM ods.order_dist
|
||||
WHERE snapshot_date = last_snapshot
|
||||
) AS window_end,
|
||||
-- GLOBAL обязателен: обе таблицы распределённые, и обычный NOT IN сверял
|
||||
-- бы дни источника с локальной частью слоя на каждом шарде — день, чьи
|
||||
-- заказы легли на соседний шард, показался бы недостающим.
|
||||
-- minOrNull отличает «дыр нет» от даты по умолчанию.
|
||||
-- GLOBAL NOT IN сравнивает дни со всем DDS. Локальное сравнение могло бы
|
||||
-- счесть день пропущенным, если его заказы находятся на соседнем шарде.
|
||||
-- minOrNull возвращает NULL, когда пропущенных дней нет.
|
||||
(
|
||||
SELECT minOrNull(day)
|
||||
FROM (
|
||||
@@ -57,7 +36,7 @@ WITH
|
||||
WHERE day GLOBAL NOT IN (SELECT order_date FROM dds.order_dist)
|
||||
) AS first_missing_day
|
||||
SELECT
|
||||
-- Дыр нет — начинаем с окна; есть — с первой из них, если она старше окна.
|
||||
-- Начало окна или первый пропущенный день, если он раньше.
|
||||
least(window_start, coalesce(first_missing_day, window_start)) AS first_day,
|
||||
window_end AS last_day
|
||||
WHERE (SELECT count() FROM ods.order_dist) > 0
|
||||
Reference in new issue
Block a user