feat(dds): реализован слой dds для bookings
- Зачем: - подготовлен учебный Star Schema слой для перехода от ODS к аналитике и витринам. - Что: - добавлены 21 SQL-файл для DDS (DDL/LOAD/DQ) с SCD1/SCD2 и фактом `fact_flight_sales`. - добавлены DAG `bookings_dds_ddl` и `bookings_to_gp_dds`, а также smoke-тесты структуры DAG. - обновлены `sql/ddl_gp.sql` и документация (`README`, `docs/*`, `db_schema`) под поток `stg -> ods -> dds`. - Проверка: - make test.
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
- [План тестирования и проверки](../TESTING.md)
|
||||
- [Главный учебный DAG: bookings → stg](bookings_to_gp_stage.md)
|
||||
- [Учебный DAG: stg -> ods](bookings_to_gp_ods.md)
|
||||
- [Учебный DAG: ods -> dds](bookings_to_gp_dds.md)
|
||||
|
||||
## Технические детали (опционально)
|
||||
|
||||
@@ -17,4 +18,5 @@
|
||||
- [PXF в этом проекте (проектная реализация)](internal/pxf_bookings.md)
|
||||
- [Дизайн stg для bookings (черновик)](internal/bookings_stg_design.md)
|
||||
- [Дизайн ods для bookings (черновик)](internal/bookings_ods_design.md)
|
||||
- [Дизайн dds для bookings (черновик)](internal/bookings_dds_design.md)
|
||||
- [Про время/UTC в bookings (черновик)](internal/bookings_tz.md)
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
# DAG `bookings_to_gp_dds`: `ods` -> `dds` в Greenplum
|
||||
|
||||
Этот DAG — учебный пример загрузки аналитического слоя **DDS** (Star Schema) из текущего состояния **ODS**.
|
||||
Логика: измерения + факт, проверки качества данных после каждой загрузки.
|
||||
|
||||
## Что делает DAG
|
||||
|
||||
- Загружает измерения DDS:
|
||||
- `dds.dim_calendar` (статическое измерение дат);
|
||||
- `dds.dim_airports`, `dds.dim_airplanes`, `dds.dim_tariffs`, `dds.dim_passengers` (SCD1 UPSERT);
|
||||
- `dds.dim_routes` (SCD2 с `hashdiff`, `valid_from`, `valid_to`).
|
||||
- Загружает факт `dds.fact_flight_sales` инкрементальным UPSERT по зерну `(ticket_no, flight_id)`.
|
||||
- Для каждой таблицы выполняет пару задач `load -> dq`.
|
||||
- Использует `_load_id = {{ run_id }}` (DDS не требует `stg_batch_id`, потому что читает current state ODS).
|
||||
|
||||
## Что должно быть готово перед запуском
|
||||
|
||||
1) Стенд поднят:
|
||||
|
||||
```bash
|
||||
make up
|
||||
```
|
||||
|
||||
2) STG и ODS уже загружены:
|
||||
|
||||
- выполнены DAG-и `bookings_to_gp_stage` и `bookings_to_gp_ods`;
|
||||
- DDL-объекты созданы (`bookings_dds_ddl` или `make ddl-gp`).
|
||||
|
||||
## Как запустить
|
||||
|
||||
1) Откройте Airflow UI: http://localhost:8080.
|
||||
2) Если запускаете DDS впервые — выполните `bookings_dds_ddl`.
|
||||
3) Запустите `bookings_to_gp_dds`.
|
||||
|
||||
## Граф зависимостей (упрощённо)
|
||||
|
||||
- `load_dds_dim_calendar -> dq_dds_dim_calendar`
|
||||
- После calendar параллельно:
|
||||
- `load_dds_dim_airports -> dq_dds_dim_airports`
|
||||
- `load_dds_dim_airplanes -> dq_dds_dim_airplanes`
|
||||
- `load_dds_dim_tariffs -> dq_dds_dim_tariffs`
|
||||
- `load_dds_dim_passengers -> dq_dds_dim_passengers`
|
||||
- `load_dds_dim_routes -> dq_dds_dim_routes`
|
||||
- Факт:
|
||||
- `load_dds_fact_flight_sales -> dq_dds_fact_flight_sales -> finish_dds_summary`
|
||||
|
||||
## Как проверить результат
|
||||
|
||||
```bash
|
||||
make gp-psql
|
||||
```
|
||||
|
||||
```sql
|
||||
SELECT COUNT(*) FROM dds.dim_calendar;
|
||||
SELECT COUNT(*) FROM dds.dim_routes;
|
||||
SELECT COUNT(*) FROM dds.fact_flight_sales;
|
||||
|
||||
SELECT
|
||||
(SELECT COUNT(*) FROM dds.fact_flight_sales) AS fact_rows,
|
||||
(SELECT COUNT(*) FROM ods.segments) AS ods_rows;
|
||||
```
|
||||
|
||||
Ожидаемо: `fact_rows = ods_rows`.
|
||||
|
||||
## Типичные ошибки
|
||||
|
||||
- `relation "dds..." does not exist`:
|
||||
- не применён DDS DDL (`bookings_dds_ddl` или `make ddl-gp`).
|
||||
- DQ падает на `dim_routes`:
|
||||
- проверьте согласованность `ods.routes` (дубли/аномальные версии) и перезапустите DAG.
|
||||
- DQ падает на `fact_flight_sales` по coverage:
|
||||
- проверьте, что ODS DAG завершился успешно без пропуска задач.
|
||||
@@ -1,6 +1,6 @@
|
||||
# Схема БД DWH (Bookings → Greenplum)
|
||||
|
||||
> **Статус:** Проект в разработке. Реализованы STG и ODS (по 9 таблиц). DDS зафиксирован как дизайн и готовится к реализации.
|
||||
> **Статус:** Проект в разработке. Реализованы STG, ODS и DDS (bookings).
|
||||
|
||||
## Обзор
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
| **Source** | ✅ Готово | Демо-БД bookings (Postgres) |
|
||||
| **STG** | ✅ Готово | 9 из 9 таблиц (bookings, tickets, airports, airplanes, routes, seats, flights, segments, boarding_passes) |
|
||||
| **ODS** | ✅ Готово | 9 из 9 таблиц + DAG `bookings_ods_ddl` и `bookings_to_gp_ods` |
|
||||
| **DDS** | ⚙️ В проектировании | Подготовлен дизайн `docs/internal/bookings_dds_design.md`, реализация запланирована |
|
||||
| **DDS** | ✅ Готово | 6 измерений + 1 факт + DAG `bookings_dds_ddl` и `bookings_to_gp_dds` |
|
||||
|
||||
### Архитектура слоёв
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
- **Хранение**: Heap или AO-CO (Append-Only Column-oriented) для аналитических запросов
|
||||
- **Структура**: Измерения (Dimensions) + Факты (Facts)
|
||||
- **Ключи**: Суррогатные ключи (SK) для измерений, FK в фактах
|
||||
- **Текущий статус**: Зафиксирован детальный дизайн (см. `docs/internal/bookings_dds_design.md`)
|
||||
- **Текущий статус**: Реализован (6 измерений, 1 факт, SQL DQ, DAG загрузки)
|
||||
|
||||
### Измерения DDS (Dimensions)
|
||||
|
||||
@@ -419,6 +419,7 @@ graph LR
|
||||
- [`docs/internal/bookings_stg_design.md`](bookings_stg_design.md) — Детальный дизайн STG слоя для bookings
|
||||
- [`docs/internal/bookings_ods_design.md`](bookings_ods_design.md) — Детальный дизайн ODS слоя (SCD1, batch contract, DQ)
|
||||
- [`docs/internal/bookings_dds_design.md`](bookings_dds_design.md) — План реализации DDS слоя (Star Schema, SCD2 для routes)
|
||||
- [`docs/bookings_to_gp_dds.md`](../bookings_to_gp_dds.md) — Запуск и проверка DAG `bookings_to_gp_dds`
|
||||
- [`docs/internal/bookings_stg_code_review.md`](bookings_stg_code_review.md) — Ревью решения и рекомендации по улучшению
|
||||
- [`docs/internal/bookings_tz.md`](bookings_tz.md) — Работа с часовыми поясами в источнике
|
||||
- [`docs/internal/pxf_bookings.md`](pxf_bookings.md) — Настройка PXF для чтения из bookings-db
|
||||
@@ -430,6 +431,7 @@ graph LR
|
||||
|
||||
| Дата | Версия | Описание изменений |
|
||||
|------|--------|-------------------|
|
||||
| 2026-02-25 | 2.2 | Реализован DDS: добавлены `sql/dds/*` (DDL/LOAD/DQ), DAG `bookings_dds_ddl`, DAG `bookings_to_gp_dds`, обновлены smoke-тесты и документация. |
|
||||
| 2026-02-23 | 2.1 | Актуализирован статус: STG+ODS реализованы. Обновлены DDS-объекты (`dds.dim_*`, `dds.fact_flight_sales`), добавлен `dds.dim_routes` (SCD2), исправлены диаграмма и TODO. |
|
||||
| 2025-01-17 | 2.0 | Удалён слой DQ для упрощения учебного стенда. Добавлены спецификации для LLM и обучающие материалы для студентов. Добавлен глоссарий терминов. |
|
||||
| 2025-01-17 | 1.1 | Исправлены названия таблиц (`aircrafts_data` → `airplanes_data`, `ticket_flights` → `segments`), удалено `dim.bookings`, добавлены суррогатные ключи, добавлен слой DQ, исправлены связи |
|
||||
@@ -441,6 +443,6 @@ graph LR
|
||||
|
||||
- [x] Реализовать STG слой полностью (все 9 таблиц)
|
||||
- [x] Реализовать ODS слой
|
||||
- [ ] Реализовать DDS слой (измерения и факт)
|
||||
- [x] Реализовать DDS слой (измерения и факт)
|
||||
- [x] Создать DAG для загрузки ODS
|
||||
- [ ] Создать DAG для загрузки DDS
|
||||
- [x] Создать DAG для загрузки DDS
|
||||
|
||||
Reference in New Issue
Block a user