refactor(dm): исправление архитектуры витрины sales_report

- Зачем:
  - исходная реализация содержала критические ошибки MPP (Load/Processing Skew) и Full Scan.
  - требуется демонстрация студентам эталонного инкрементального UPSERT.
- Что:
  - изменен ключ дистрибуции с flight_date на (departure_airport_sk, arrival_airport_sk).
  - внедрен каноничный UPSERT через TEMP TABLE (агрегация выполняется один раз).
  - добавлен инкрементальный фильтр по {{ ds }} для предотвращения Full Scan dds.fact_flight_sales.
  - проверки DQ переведены в инкрементальный режим (валидация только текущего батча).
- Проверка:
  - airflow dags test bookings_to_gp_dm 2026-02-28.
This commit is contained in:
2026-02-28 23:56:31 +03:00
parent 20a1270633
commit a8cce6cd6b
3 changed files with 112 additions and 128 deletions
+10 -1
View File
@@ -7,6 +7,15 @@
-- - Денормализация измерений (города, аэропорты, тарифы) для удобства аналитики
-- - Служебные поля календаря (day_of_week, day_name, is_weekend)
-- - Heap-таблица с UPDATE (нужен для UPSERT)
--
-- ВНИМАНИЕ (Антипаттерн распределения):
-- Никогда не распределяйте таблицы по дате (DISTRIBUTED BY flight_date) в MPP-системах!
-- 1. Load Skew: При инкрементальной загрузке весь батч за один день запишется на ОДИН сегмент,
-- а остальные будут простаивать. Кластер превратится в одиночный сервер.
-- 2. Processing Skew: Запросы аналитиков за конкретный день будут читаться только с одного сегмента.
--
-- ПРАВИЛЬНЫЙ ВЫБОР: Распределение по полям с высокой кардинальностью (направления).
-- В нашем случае это комбинация departure_airport_sk и arrival_airport_sk.
CREATE SCHEMA IF NOT EXISTS dm;
@@ -44,7 +53,7 @@ CREATE TABLE IF NOT EXISTS dm.sales_report (
_load_id TEXT NOT NULL,
_load_ts TIMESTAMP NOT NULL DEFAULT now()
)
DISTRIBUTED BY (flight_date);
DISTRIBUTED BY (departure_airport_sk, arrival_airport_sk);
-- Комментарии для документирования
COMMENT ON TABLE dm.sales_report IS