- Зачем: - требуется эталонная витрина для обучения паттернам DM-слоя - демонстрация UPSERT-логики с IS DISTINCT FROM для идемпотентности - Что: - DDL: heap-таблица dm.sales_report с 18 полями, DISTRIBUTED BY (flight_date) - Load: UPSERT (UPDATE + INSERT) с JOIN dim_calendar, dim_airports (x2), dim_tariffs, fact_flight_sales - DQ: PL/pgSQL DO $$ с проверками непустоты, уникальности, tickets_sold >= passengers_boarded, boarding_rate BETWEEN 0 AND 1 - DAGs: bookings_dm_ddl (DDL), bookings_to_gp_dm (ETL + DQ с параллельными ветками) - Tests: smoke-тесты для обоих DAG - sql/ddl_gp.sql: добавлен \i dm/sales_report_ddl.sql - Проверка: - make fmt && make lint — passed - make test — 15 passed, 11 skipped - make ddl-gp — DDL applied successfully - airflow dags test bookings_to_gp_dm 2026-02-28T13:00:00 — 4 tasks SUCCESS - 9243 rows loaded, _load_id подставлен корректно (Jinja2 templating works) - DQ checks passed
63 lines
2.6 KiB
PL/PgSQL
63 lines
2.6 KiB
PL/PgSQL
-- Главный входной DDL-скрипт для Greenplum в учебном стенде.
|
|
-- Выполняется из контейнера командой `make ddl-gp` и создаёт/обновляет
|
|
-- все объекты, которые нужны базовым DAG (csv_to_greenplum, bookings_to_gp_stage);
|
|
-- подключает файловые DDL через \i, чтобы сохранять единый входной скрипт.
|
|
--
|
|
-- Чтобы не ломать задания, новые объекты лучше добавлять в отдельные файлы
|
|
-- и подключать их отсюда, а существующие определения не удалять.
|
|
--
|
|
-- Подробнее про STG/bookings: см. docs/bookings_to_gp_stage.md.
|
|
|
|
-- Таблица для CSV‑пайплайна (csv_to_greenplum).
|
|
\i base/orders_ddl.sql
|
|
|
|
-- Внешняя таблица для чтения данных из демо-БД bookings через PXF (JDBC).
|
|
-- Источник: таблица bookings.bookings в базе demo (Postgres, сервис bookings-db).
|
|
DROP EXTERNAL TABLE IF EXISTS public.ext_bookings_bookings;
|
|
CREATE EXTERNAL TABLE public.ext_bookings_bookings (
|
|
book_ref CHAR(6),
|
|
book_date TIMESTAMP,
|
|
total_amount NUMERIC(10,2)
|
|
)
|
|
LOCATION ('pxf://bookings.bookings?PROFILE=JDBC&SERVER=bookings-db')
|
|
FORMAT 'CUSTOM' (formatter='pxfwritable_import');
|
|
|
|
-- DDL для слоя stg по таблицам bookings и tickets вынесены в отдельные файлы.
|
|
-- Здесь подключаем их через psql \i, чтобы сохранить единый входной скрипт.
|
|
\i stg/bookings_ddl.sql
|
|
\i stg/tickets_ddl.sql
|
|
|
|
-- DDL для новых таблиц STG слоя (справочники)
|
|
\i stg/airports_ddl.sql
|
|
\i stg/airplanes_ddl.sql
|
|
\i stg/routes_ddl.sql
|
|
\i stg/seats_ddl.sql
|
|
|
|
-- DDL для новых таблиц STG слоя (транзакции)
|
|
\i stg/flights_ddl.sql
|
|
\i stg/segments_ddl.sql
|
|
\i stg/boarding_passes_ddl.sql
|
|
|
|
-- DDL для ODS-слоя (текущее состояние, SCD1).
|
|
\i ods/airports_ddl.sql
|
|
\i ods/airplanes_ddl.sql
|
|
\i ods/routes_ddl.sql
|
|
\i ods/seats_ddl.sql
|
|
\i ods/bookings_ddl.sql
|
|
\i ods/tickets_ddl.sql
|
|
\i ods/flights_ddl.sql
|
|
\i ods/segments_ddl.sql
|
|
\i ods/boarding_passes_ddl.sql
|
|
|
|
-- DDL для DDS-слоя (Star Schema, SCD1 + SCD2).
|
|
\i dds/dim_calendar_ddl.sql
|
|
\i dds/dim_airports_ddl.sql
|
|
\i dds/dim_airplanes_ddl.sql
|
|
\i dds/dim_tariffs_ddl.sql
|
|
\i dds/dim_passengers_ddl.sql
|
|
\i dds/dim_routes_ddl.sql
|
|
\i dds/fact_flight_sales_ddl.sql
|
|
|
|
-- DDL для DM-слоя (Data Mart).
|
|
\i dm/sales_report_ddl.sql
|