feat(superset): честный row-lineage по слоям вместо ложной DQ-воронки
- Зачем:
- чарт «Data Quality Summary» суммировал total_rows по всем таблицам слоя,
складывал таблицы разного зерна (события 1000 + визиты 99 + error-таблицы 0)
и рисовал убывающую «воронку потерь» (stg≈4250→ods≈2198→dds≈1099), которой
в данных нет. На учебном стенде это активно вводит в заблуждение.
- Что:
- чарт переделан в row-lineage одного event-зерна и переименован в
«🧱 Rows by Layer (event)»; rename идемпотентный через previous_slice_names.
- чарт берёт по одной канонической таблице на слой
(browser_raw→browser_event→event→v_events_enriched), порядок слоёв задан
числовым префиксом в groupby + order_bars.
- в dm.dq_summary добавлена строка total_rows для слоя dm, чтобы цепочка
замыкалась до витрины.
- описание дашборда обновлено под новый смысл.
- Проверка:
- python3 -m py_compile superset/create_dashboard.py.
- make transform / прогон sql/dm/40_dds_to_dm.sql; в dq_summary есть строка dm.
- make superset-dashboard (идемпотентно, 10 чартов, дублей нет).
- визуально через playwright-cli: 4 столбца 1·stg→2·ods→3·dds→4·dm,
видимый шаг дедупликации 1050→1000, консоль без ошибок.
This commit is contained in:
+13
-6
@@ -2,7 +2,7 @@
|
||||
-- Batch-трансформация: DDS → DM (Data Quality summary)
|
||||
-- ============================================================================
|
||||
-- Поток данных:
|
||||
-- dds.click + dds.event + ods.* + stg.* → dm.dq_summary (сводка по слоям)
|
||||
-- stg.* + ods.* + dds.* + dm.v_events_enriched → dm.dq_summary (сводка по слоям)
|
||||
-- Сами витрины (dm.v_*) — это VIEW поверх DDS, создаются в sql/ddl/dm/40_dm.sql.
|
||||
--
|
||||
-- Что делает:
|
||||
@@ -27,7 +27,7 @@
|
||||
CREATE TABLE IF NOT EXISTS dm.dq_summary
|
||||
(
|
||||
check_date Date, -- Дата проверки
|
||||
layer LowCardinality(String), -- Слой: stg, ods, dds
|
||||
layer LowCardinality(String), -- Слой: stg, ods, dds, dm
|
||||
table_name LowCardinality(String), -- Имя таблицы
|
||||
check_name LowCardinality(String), -- Тип проверки: total_rows, rows_with_errors и т.д.
|
||||
check_value UInt64 -- Значение метрики
|
||||
@@ -102,7 +102,14 @@ UNION ALL
|
||||
SELECT today(), 'dds', 'click', 'total_rows', count() FROM dds.click
|
||||
UNION ALL
|
||||
-- Считаем "осиротевшие" события (есть click_id, но нет такого click в dds.click)
|
||||
SELECT today(), 'dds', 'event_without_click', 'orphan_events', count()
|
||||
FROM dds.event
|
||||
WHERE click_id IS NOT NULL
|
||||
AND click_id NOT IN (SELECT click_id FROM dds.click);
|
||||
SELECT today(), 'dds', 'event_without_click', 'orphan_events', count()
|
||||
FROM dds.event
|
||||
WHERE click_id IS NOT NULL
|
||||
AND click_id NOT IN (SELECT click_id FROM dds.click)
|
||||
|
||||
UNION ALL
|
||||
-- DM-слой: финальная витрина событий (VIEW поверх dds.event).
|
||||
-- Нужна, чтобы lineage-чарт замыкал цепочку stg→ods→dds→dm на одном (event) зерне.
|
||||
-- VIEW создаётся в DDL (sql/ddl/dm/40_dm.sql) до трансформаций, а этот шаг идёт
|
||||
-- после наполнения dds.event — поэтому count() здесь корректен.
|
||||
SELECT today(), 'dm', 'v_events_enriched', 'total_rows', count() FROM dm.v_events_enriched;
|
||||
|
||||
Reference in New Issue
Block a user