вынесли sql из dag в папку sql

This commit is contained in:
2025-12-10 16:59:50 +03:00
parent 2c8f5c1e23
commit cacf989a9c
11 changed files with 292 additions and 424 deletions
+13 -18
View File
@@ -21,7 +21,7 @@ _Внутренний файл, чтобы не забыть договорён
- Стенд поднят: `make up`.
- Демо‑БД bookings инициализирована: `make bookings-init`.
- В Greenplum применён DDL (созданы схема `stg` и таблицы `stg.bookings_ext` / `stg.bookings`):
- `make ddl-gp` (использует `sql/ddl_gp.sql`).
- `make ddl-gp` (использует `sql/ddl_gp.sql`, который подтягивает `sql/stg/bookings_ddl.sql`).
- В Airflow есть коннекты:
- `greenplum_conn` (по умолчанию уже используется в helpers/greenplum.py);
- `bookings_db` (Postgres к сервису `bookings-db`, если не хочется полагаться на ENV).
@@ -29,23 +29,19 @@ _Внутренний файл, чтобы не забыть договорён
## 3. Последовательность задач в DAG
- `generate_bookings_day`:
- проверяет наличие таблицы `bookings.bookings`;
- смотрит, есть ли строки за `load_date` (`book_date::date = load_date`);
- если день уже сгенерирован — ничего не делает (идемпотентность), просто логирует это;
- если нет — запускает генератор через DO‑блок (логика как в `bookings/generate_next_day.sql`).
- `get_last_loaded_ts_from_gp`:
- проверяет, что есть таблица `stg.bookings`;
- берёт `max(src_created_at_ts)` как последнюю загруженную метку;
- если NULL — значит в STG ещё нет данных, дальше идём в режим `full`.
- `extract_and_load_increment_via_pxf`:
- читает данные из `stg.bookings_ext` и вставляет в `stg.bookings`;
- при `last_loaded_ts is None` делает полную загрузку (full) — все строки;
- при delta берёт только строки с `book_date > last_loaded_ts` и `book_date <= load_date + 1 day`;
- приводит бизнес‑поля к `TEXT`, заполняет `src_created_at_ts`, `load_dttm`, `batch_id={{ ds_nodash }}`.
- PostgresOperator к `bookings-db`;
- выполняет SQL `/sql/src/bookings_generate_day_if_missing.sql`;
- скрипт сам проверяет, есть ли строки за `load_date` (`book_date::date = load_date`);
- если день уже сгенерирован — ничего не делает (идемпотентность), только пишет NOTICE.
- `load_bookings_to_stg`:
- PostgresOperator к Greenplum;
- выполняет SQL `/sql/stg/bookings_load.sql`;
- считает «старый» максимум `src_created_at_ts` (по предыдущим батчам) и грузит только новые строки из `stg.bookings_ext`, заполняя `src_created_at_ts`, `load_dttm`, `batch_id={{ ds_nodash }}`.
- `check_row_counts`:
- пересчитывает количество строк в источнике (`stg.bookings_ext`) за текущее окно (full/delta);
- сравнивает с количеством строк в `stg.bookings` для текущего `batch_id`;
- если не сходится — падает с понятным сообщением и подсказкой «куда смотреть».
- PostgresOperator к Greenplum;
- выполняет SQL `/sql/stg/bookings_dq.sql`;
- за то же окно инкремента считает количество строк в источнике и в `stg.bookings` (по текущему `batch_id`);
- при расхождении делает `RAISE EXCEPTION` с понятным текстом ошибки.
- `finish_summary`:
- логирует итог выполнения DAG за одно срабатывание.
@@ -78,4 +74,3 @@ _Внутренний файл, чтобы не забыть договорён
- В будущем всё это нужно будет собрать в одну понятную историю для студента:
- отдельный раздел «Учебный пример: bookings → stg → dwh»;
- скриншоты DAG, примеры запросов и типичные ошибки.