refactor(all): унифицированы служебные поля STG — переход на канонический нейминг
- Зачем:
- STG-слой использовал legacy-имена (batch_id, load_dttm, src_created_at_ts),
тогда как ODS/DDS/DM уже работали с каноном (_load_id, _load_ts, event_ts).
Студент видел разные имена для одного понятия — это убрано.
- Что:
- переименованы колонки в 9 STG DDL: batch_id→_load_id, load_dttm→_load_ts,
src_created_at_ts→event_ts; добавлен NOT NULL для _load_id во всех таблицах.
- обновлены 9 STG Load, 9 STG DQ, 9 ODS Load, 9 ODS DQ (INSERT/SELECT/WHERE).
- обновлены DAG-файлы bookings_to_gp_stage.py и bookings_to_gp_ods.py
(встроенный SQL резолвера, комментарии; Python-идентификаторы не тронуты).
- обновлены тесты и ~15 документов (naming_conventions, PRD, db_schema,
design-docs, qa-plan, README, TESTING и др.).
- Проверка:
- grep -rn 'load_dttm\|src_created_at_ts' sql/ airflow/ tests/ — 0 совпадений.
- make test — 4 passed.
- e2e-etl: day1 прошёл полностью, day2 стартовал без ошибок.
This commit is contained in:
@@ -39,7 +39,7 @@ def _resolve_stg_batch_id(**context) -> str:
|
||||
|
||||
Для инкрементальных транзакционных таблиц (bookings, tickets, flights, segments,
|
||||
boarding_passes) этот батч НЕ используется. Вместо этого они грузят все новые
|
||||
записи по HWM: WHERE load_dttm > (SELECT MAX(_load_ts) FROM ods.table).
|
||||
записи по HWM: WHERE _load_ts > (SELECT MAX(_load_ts) FROM ods.table).
|
||||
Это сделано для того, чтобы не потерять инкременты, если STG-DAG запускался
|
||||
несколько раз до запуска ODS-DAG'а.
|
||||
|
||||
@@ -57,50 +57,50 @@ def _resolve_stg_batch_id(**context) -> str:
|
||||
result = hook.get_first(
|
||||
"""
|
||||
WITH candidate_batches AS (
|
||||
SELECT batch_id
|
||||
SELECT _load_id
|
||||
FROM stg.airports
|
||||
WHERE batch_id IS NOT NULL AND batch_id <> ''
|
||||
GROUP BY batch_id
|
||||
WHERE _load_id IS NOT NULL AND _load_id <> ''
|
||||
GROUP BY _load_id
|
||||
INTERSECT
|
||||
SELECT batch_id
|
||||
SELECT _load_id
|
||||
FROM stg.airplanes
|
||||
WHERE batch_id IS NOT NULL AND batch_id <> ''
|
||||
GROUP BY batch_id
|
||||
WHERE _load_id IS NOT NULL AND _load_id <> ''
|
||||
GROUP BY _load_id
|
||||
INTERSECT
|
||||
SELECT batch_id
|
||||
SELECT _load_id
|
||||
FROM stg.routes
|
||||
WHERE batch_id IS NOT NULL AND batch_id <> ''
|
||||
GROUP BY batch_id
|
||||
WHERE _load_id IS NOT NULL AND _load_id <> ''
|
||||
GROUP BY _load_id
|
||||
INTERSECT
|
||||
SELECT batch_id
|
||||
SELECT _load_id
|
||||
FROM stg.seats
|
||||
WHERE batch_id IS NOT NULL AND batch_id <> ''
|
||||
GROUP BY batch_id
|
||||
WHERE _load_id IS NOT NULL AND _load_id <> ''
|
||||
GROUP BY _load_id
|
||||
),
|
||||
batch_ready AS (
|
||||
SELECT
|
||||
c.batch_id,
|
||||
c._load_id,
|
||||
GREATEST(
|
||||
COALESCE(
|
||||
(SELECT MAX(load_dttm) FROM stg.airports a WHERE a.batch_id = c.batch_id),
|
||||
(SELECT MAX(_load_ts) FROM stg.airports a WHERE a._load_id = c._load_id),
|
||||
TIMESTAMP '1900-01-01 00:00:00'
|
||||
),
|
||||
COALESCE(
|
||||
(SELECT MAX(load_dttm) FROM stg.airplanes a WHERE a.batch_id = c.batch_id),
|
||||
(SELECT MAX(_load_ts) FROM stg.airplanes a WHERE a._load_id = c._load_id),
|
||||
TIMESTAMP '1900-01-01 00:00:00'
|
||||
),
|
||||
COALESCE(
|
||||
(SELECT MAX(load_dttm) FROM stg.routes r WHERE r.batch_id = c.batch_id),
|
||||
(SELECT MAX(_load_ts) FROM stg.routes r WHERE r._load_id = c._load_id),
|
||||
TIMESTAMP '1900-01-01 00:00:00'
|
||||
),
|
||||
COALESCE(
|
||||
(SELECT MAX(load_dttm) FROM stg.seats s WHERE s.batch_id = c.batch_id),
|
||||
(SELECT MAX(_load_ts) FROM stg.seats s WHERE s._load_id = c._load_id),
|
||||
TIMESTAMP '1900-01-01 00:00:00'
|
||||
)
|
||||
) AS ready_dttm
|
||||
FROM candidate_batches c
|
||||
)
|
||||
SELECT batch_id
|
||||
SELECT _load_id
|
||||
FROM batch_ready
|
||||
ORDER BY ready_dttm DESC
|
||||
LIMIT 1
|
||||
|
||||
@@ -12,7 +12,7 @@ from __future__ import annotations
|
||||
Каждый запуск DAG работает как «шаг по времени вперёд»:
|
||||
- генератор в демо-БД bookings добавляет следующий учебный день после max(book_date);
|
||||
- загрузка в Greenplum берёт все строки, появившиеся после предыдущих батчей;
|
||||
- `run_id` используется как метка запуска (в `batch_id`, в логах и DQ).
|
||||
- `run_id` используется как метка запуска (в `_load_id`, в логах и DQ).
|
||||
|
||||
Важно: для инкрементальных таблиц «пустое окно инкремента» допустимо (это не ошибка).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user