Одна диаграмма отвечает на один вопрос: db_schema.md перестроен в лесенку из четырёх схем (слои, звезда, сборка факта, витрины), полная lineage-карта перенесена в конец как справочная. Новые документы: reading_the_pipeline.md (метод чтения FROM/JOIN load-скрипта, разбор fact_src) и dq_taxonomy.md (три класса DQ-проверок на реальных скриптах, семантика NULL). Точки входа: корневой README, docs/README.md, assignment/README.md, qa-plan.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
86 lines
5.2 KiB
Markdown
86 lines
5.2 KiB
Markdown
# Учебные задания
|
||
|
||
## О чём задание
|
||
|
||
В стенде уже работает **эталонный вертикальный срез** — полная цепочка
|
||
`STG → ODS → DDS → DM` для витрины `dm.sales_report`. Ваша задача —
|
||
реализовать недостающие загрузки по аналогии с эталоном.
|
||
|
||
На месте ваших заданий сейчас стоят **заглушки** (`SELECT 1;`). Вы замените
|
||
их на реальную SQL-логику, и после этого весь DWH будет заполнен.
|
||
|
||
## С чего начать чтение
|
||
|
||
Сначала посмотрите [схему DWH по уровням приближения](../design/db_schema.md).
|
||
Пока пишете свой слой, держите рядом [метод чтения скрипта загрузки](../design/reading_the_pipeline.md).
|
||
Для `*_dq.sql` сверяйтесь с [классами DQ-проверок](../reference/dq_taxonomy.md).
|
||
|
||
## Перед началом
|
||
|
||
Убедитесь, что стенд запущен и данные загружены —
|
||
пройдите шаги 1–6 из [README (Быстрый старт)](../../README.md#быстрый-старт-основной-сценарий-bookings--stg--ods--dds--dm).
|
||
|
||
После этого в Greenplum будут данные в эталонных таблицах (`stg.*`, `ods.bookings`,
|
||
`dds.dim_airports`, `dds.fact_flight_sales`, `dm.sales_report` и др.).
|
||
|
||
## Шаг 1. Изучите эталон
|
||
|
||
Прежде чем писать код, разберите, как устроены эталонные загрузки.
|
||
По одному файлу на каждый ключевой паттерн:
|
||
|
||
| Паттерн | Файл для изучения | Что посмотреть |
|
||
|---------|-------------------|----------------|
|
||
| ODS: TRUNCATE + INSERT (snapshot-справочник) | `sql/ods/airports_load.sql` | Фильтрация по `stg_batch_id`, дедупликация через `ROW_NUMBER()` |
|
||
| DDS: SCD1 UPSERT (измерение) | `sql/dds/dim_airports_load.sql` | TEMP TABLE → UPDATE (`IS DISTINCT FROM`) → INSERT |
|
||
| DM: витрина с UPSERT | `sql/dm/sales_report_load.sql` | HWM-инкремент, агрегация фактов по измерениям |
|
||
|
||
Описания каждого DAG — в `docs/`:
|
||
[STG](../bookings_to_gp_stage.md) ·
|
||
[ODS](../bookings_to_gp_ods.md) ·
|
||
[DDS](../bookings_to_gp_dds.md) ·
|
||
[DM](../bookings_to_gp_dm.md)
|
||
|
||
## Шаг 2. Откройте ТЗ
|
||
|
||
Техническое задание от аналитика: **[analyst_spec.md](analyst_spec.md)**.
|
||
|
||
Там описаны все таблицы, которые нужно реализовать, с маппингами, бизнес-правилами
|
||
и подсказками. Рекомендуемый порядок (от простого к сложному):
|
||
|
||
1. ODS: `airplanes`, `seats`
|
||
2. DDS: `dim_airplanes`, `dim_passengers` (SCD1)
|
||
3. DDS: `dim_routes` (SCD2 — ключевой вызов курсовой)
|
||
4. DM: `airport_traffic`, `route_performance`, `monthly_overview`, `passenger_loyalty`
|
||
|
||
## Шаг 3. Реализуйте задания
|
||
|
||
- **Файлы-заглушки уже на месте** — например, `sql/ods/airplanes_load.sql`
|
||
содержит `SELECT 1;`. Ваша задача: заменить `SELECT 1;` на реальную SQL-логику.
|
||
- **DDL уже создан** — таблицы существуют, создавать их не нужно.
|
||
- **Таски в DAG-ах уже подключены** — `PostgresOperator` ссылается на ваши SQL-файлы.
|
||
Менять Python-код DAG-ов не нужно.
|
||
- **Нейминг полей:** сверяйтесь с `docs/design/naming_conventions.md`.
|
||
|
||
## Шаг 4. Проверьте себя валидационным DAG-ом
|
||
|
||
DAG **`bookings_validate`** — автоматическая проверка вашей реализации.
|
||
|
||
- Три группы проверок: `validate_ods`, `validate_dds`, `validate_dm` — запускаются
|
||
параллельно. Можно проверять ODS, пока DDS ещё не готов.
|
||
- Включает активный SCD2-тест для `dim_routes`: загружает изменённые данные
|
||
и проверяет, что версионирование работает корректно.
|
||
- Сообщения об ошибках подскажут, что именно не так и что делать дальше.
|
||
|
||
**Цель: все проверки зелёные.**
|
||
|
||
## Если застряли
|
||
|
||
- Изучите эталонные SQL-скрипты — в них те же паттерны, что нужны для заданий.
|
||
- Загляните в `docs/design/naming_conventions.md` — единый источник нейминга полей.
|
||
- Сверьтесь с **веткой `solution`** — там полная рабочая реализация.
|
||
|
||
## Для менторов
|
||
|
||
Дизайн заданий и педагогическая логика — в ветке `solution`
|
||
(`docs/design/assignment_design.md`).
|