- Зачем: - необходимо продемонстрировать студентам альтернативный паттерн загрузки (Full Rebuild) и использование AO Column Store в Greenplum. - Что: - созданы DDL, Load и DQ скрипты для витрины dm.route_performance (эффективность маршрутов). - реализована агрегация по бизнес-ключу route_bk для корректной обработки SCD2-измерений. - настроен формат хранения AO Column Store с компрессией zstd (уровень 1). - обновлены DAGи bookings_dm_ddl и bookings_to_gp_dm для параллельной оркестрации новой витрины. - Проверка: - визуальный аудит SQL-кода на соответствие naming_conventions.md. - проверка структуры DAG в Airflow (параллельные ветки load -> dq). - наличие бизнес-инварианта total_boarded <= total_tickets в DQ-скрипте.
60 lines
2.7 KiB
SQL
60 lines
2.7 KiB
SQL
-- DQ проверки для витрины dm.route_performance.
|
||
--
|
||
-- Учебные цели:
|
||
-- 1. Использование PL/pgSQL блоков (DO $$ ...) для кастомных проверок.
|
||
-- 2. Валидация бизнес-инвариантов после загрузки Full Rebuild.
|
||
|
||
DO $$
|
||
DECLARE
|
||
row_count INTEGER;
|
||
duplicate_count INTEGER;
|
||
invalid_metrics_count INTEGER;
|
||
null_attributes_count INTEGER;
|
||
BEGIN
|
||
-- 1. Проверка на наполненность
|
||
SELECT COUNT(*) INTO row_count FROM dm.route_performance;
|
||
IF row_count = 0 THEN
|
||
RAISE EXCEPTION 'DQ Error: Таблица dm.route_performance пуста после загрузки.';
|
||
END IF;
|
||
|
||
-- 2. Проверка на уникальность бизнес-ключа
|
||
SELECT COUNT(*) INTO duplicate_count
|
||
FROM (
|
||
SELECT route_bk FROM dm.route_performance
|
||
GROUP BY route_bk HAVING COUNT(*) > 1
|
||
) AS q;
|
||
IF duplicate_count > 0 THEN
|
||
RAISE EXCEPTION 'DQ Error: В dm.route_performance обнаружены дубликаты по route_bk (% шт).', duplicate_count;
|
||
END IF;
|
||
|
||
-- 3. Проверка бизнес-метрик (инварианты)
|
||
-- Load factor не может быть отрицательным или физически невозможным (например, более 200%)
|
||
SELECT COUNT(*) INTO invalid_metrics_count
|
||
FROM dm.route_performance
|
||
WHERE avg_load_factor < 0 OR avg_load_factor > 2.0;
|
||
|
||
IF invalid_metrics_count > 0 THEN
|
||
RAISE EXCEPTION 'DQ Error: В dm.route_performance обнаружены некорректные показатели load factor (% строк).', invalid_metrics_count;
|
||
END IF;
|
||
|
||
-- 4. Проверка обязательных атрибутов на NULL
|
||
SELECT COUNT(*) INTO null_attributes_count
|
||
FROM dm.route_performance
|
||
WHERE departure_city IS NULL OR arrival_city IS NULL OR airplane_model IS NULL;
|
||
|
||
IF null_attributes_count > 0 THEN
|
||
RAISE EXCEPTION 'DQ Error: В dm.route_performance обнаружены NULL-значения в обязательных полях (% строк).', null_attributes_count;
|
||
END IF;
|
||
|
||
-- 5. Проверка: посаженных не может быть больше, чем купивших билет
|
||
SELECT COUNT(*) INTO invalid_metrics_count
|
||
FROM dm.route_performance
|
||
WHERE total_boarded > total_tickets;
|
||
|
||
IF invalid_metrics_count > 0 THEN
|
||
RAISE EXCEPTION 'DQ Error: В dm.route_performance total_boarded > total_tickets (% строк).', invalid_metrics_count;
|
||
END IF;
|
||
|
||
RAISE NOTICE 'DQ Success: dm.route_performance успешно прошла все проверки (% строк).', row_count;
|
||
END $$;
|