docs: add russian comments to pipeline files

This commit is contained in:
2026-02-06 22:45:39 +03:00
parent 36139e0c78
commit d7cff5ad1e
9 changed files with 523 additions and 240 deletions
+86 -34
View File
@@ -1,7 +1,28 @@
-- DM layer: Data Marts for BI (Superset)
-- Views for enriched data and pre-computed aggregations
-- ============================================================================
-- Слой DM (Data Marts) — витрины для BI (Superset/Grafana)
-- ============================================================================
-- Назначение:
-- - Представления (VIEW) для удобного доступа к данным из BI-инструментов
-- - Обогащение: соединяем event + click через LEFT JOIN
-- - Агрегации: готовые GROUP BY для частых запросов
--
-- Почему VIEW:
-- - Гибкость: меняем логику без пересоздания таблиц
-- - Нет дублирования данных (храним только в DDS)
-- - Для демо: производительность достаточная
--
-- Для продакшена:
-- - Если тяжёлые агрегации тормозят — материализовать в таблицы
-- - См. пример закомментированный в jobs/40_dm_refresh.sql
-- ============================================================================
-- Main enriched view: event + click context
-- ----------------------------------------------------------------------------
-- Витрина: полное обогащение событий (event + click)
-- ----------------------------------------------------------------------------
-- Соединяет dds.event и dds.click через click_id
-- LEFT JOIN: не все события имеют device/geo контекст
-- Используется как основа для других витрин
-- ----------------------------------------------------------------------------
CREATE VIEW IF NOT EXISTS dm.v_events_enriched AS
SELECT
e.event_id,
@@ -9,6 +30,7 @@ SELECT
e.event_date,
e.event_type,
e.click_id,
-- Поля из location (через event)
e.page_url,
e.page_url_path,
e.referer_url,
@@ -17,9 +39,11 @@ SELECT
e.utm_source,
e.utm_content,
e.utm_campaign,
-- Поля из browser (через event)
e.browser_name,
e.browser_language,
e.browser_user_agent,
-- Поля из click (device + geo), могут быть NULL
c.user_domain_id,
c.user_custom_id,
c.device_type,
@@ -32,12 +56,19 @@ SELECT
c.geo_latitude,
c.geo_longitude,
c.ip_address,
-- Технические поля
e.dds_update_ts,
-- Объединяем ошибки парсинга из обоих источников
arrayConcat(e.ods_parse_errors, c.ods_parse_errors) AS parse_errors
FROM dds.event AS e
LEFT JOIN dds.click AS c ON c.click_id = e.click_id;
-- Daily traffic aggregation
-- ----------------------------------------------------------------------------
-- Витрина: агрегация трафика по дням и измерениям
-- ----------------------------------------------------------------------------
-- Используется для анализа посещаемости
-- Гранулярность: дата × страна × устройство × браузер × UTM
-- ----------------------------------------------------------------------------
CREATE VIEW IF NOT EXISTS dm.v_daily_traffic AS
SELECT
event_date,
@@ -46,11 +77,11 @@ SELECT
browser_name,
utm_source,
utm_medium,
count() AS events,
uniqExact(click_id) AS uniq_clicks,
uniqExact(user_domain_id) AS uniq_users
count() AS events, -- Количество событий
uniqExact(click_id) AS uniq_clicks, -- Уникальные сессии
uniqExact(user_domain_id) AS uniq_users -- Уникальные пользователи
FROM dm.v_events_enriched
WHERE event_ts IS NOT NULL
WHERE event_ts IS NOT NULL -- Фильтруем битые timestamp
GROUP BY
event_date,
geo_country,
@@ -59,59 +90,80 @@ GROUP BY
utm_source,
utm_medium;
-- Top pages daily
-- ----------------------------------------------------------------------------
-- Витрина: популярность страниц (воронка)
-- ----------------------------------------------------------------------------
-- Показывает какие страницы чаще всего просматривают
-- Используется для анализа воронки конверсии
-- ----------------------------------------------------------------------------
CREATE VIEW IF NOT EXISTS dm.v_top_pages_daily AS
SELECT
event_date,
page_url_path,
count() AS pageviews,
uniqExact(click_id) AS uniq_clicks
page_url_path, -- Путь URL (/home, /product)
count() AS pageviews, -- Количество просмотров
uniqExact(click_id) AS uniq_clicks -- Уникальные сессии
FROM dm.v_events_enriched
WHERE event_type = 'pageview'
WHERE event_type = 'pageview' -- Только просмотры страниц
GROUP BY event_date, page_url_path;
-- Data Quality errors daily
-- ----------------------------------------------------------------------------
-- Витрина: ошибки парсинга по дням
-- ----------------------------------------------------------------------------
-- Для мониторинга качества данных
-- Показывает сколько строк с какими ошибками за каждый день
-- ----------------------------------------------------------------------------
CREATE VIEW IF NOT EXISTS dm.v_dq_errors_daily AS
SELECT
event_date,
arrayJoin(parse_errors) AS error_code,
count() AS rows_cnt
arrayJoin(parse_errors) AS error_code, -- Разворачиваем массив ошибок
count() AS rows_cnt -- Количество строк с этой ошибкой
FROM dm.v_events_enriched
WHERE length(parse_errors) > 0
WHERE length(parse_errors) > 0 -- Только строки с ошибками
GROUP BY event_date, error_code;
-- User sessions overview (approximate, by click_id within 30min windows)
-- ----------------------------------------------------------------------------
-- Витрина: обзор сессий пользователей
-- ----------------------------------------------------------------------------
-- Группировка по click_id (сессия) и user_domain_id (пользователь)
-- Показывает длительность сессии, посещённые страницы, устройства
-- ----------------------------------------------------------------------------
CREATE VIEW IF NOT EXISTS dm.v_session_overview AS
SELECT
event_date,
user_domain_id,
click_id,
min(event_ts) AS session_start,
max(event_ts) AS session_end,
date_diff('minute', min(event_ts), max(event_ts)) AS session_duration_min,
count() AS events_count,
arrayDistinct(groupArray(page_url_path)) AS pages_visited,
arrayDistinct(groupArray(geo_country)) AS countries,
arrayDistinct(groupArray(device_type)) AS devices,
min(event_ts) AS session_start, -- Начало сессии
max(event_ts) AS session_end, -- Конец сессии
date_diff('minute', min(event_ts), max(event_ts)) AS session_duration_min, -- Длительность
count() AS events_count, -- Количество событий в сессии
arrayDistinct(groupArray(page_url_path)) AS pages_visited, -- Уникальные страницы
arrayDistinct(groupArray(geo_country)) AS countries, -- Страны (если менялась)
arrayDistinct(groupArray(device_type)) AS devices, -- Устройства (если менялось)
-- Берём последние UTM-метки сессии (для атрибуции)
groupArraySample(1, 1919)(utm_source)[1] AS utm_source_last,
groupArraySample(1, 1919)(utm_medium)[1] AS utm_medium_last
FROM dm.v_events_enriched
WHERE user_domain_id IS NOT NULL
WHERE user_domain_id IS NOT NULL -- Только идентифицированные пользователи
GROUP BY event_date, user_domain_id, click_id;
-- UTM effectiveness (for marketing analysis)
-- ----------------------------------------------------------------------------
-- Витрина: эффективность UTM-кампаний (маркетинговая аналитика)
-- ----------------------------------------------------------------------------
-- Показывает какие каналы (utm_source/medium) приносят трафик
-- Отдельно считаем pageviews, purchases, add_to_carts
-- ----------------------------------------------------------------------------
CREATE VIEW IF NOT EXISTS dm.v_utm_effectiveness AS
SELECT
event_date,
utm_source,
utm_medium,
utm_campaign,
count() AS clicks,
uniqExact(user_domain_id) AS uniq_users,
uniqExact(click_id) AS uniq_sessions,
countIf(event_type = 'pageview') AS pageviews,
countIf(event_type = 'purchase') AS purchases,
countIf(event_type = 'add_to_cart') AS add_to_carts
count() AS clicks, -- Всего кликов/событий
uniqExact(user_domain_id) AS uniq_users, -- Уникальные пользователи
uniqExact(click_id) AS uniq_sessions, -- Уникальные сессии
countIf(event_type = 'pageview') AS pageviews, -- Только просмотры
countIf(event_type = 'purchase') AS purchases, -- Покупки (если есть)
countIf(event_type = 'add_to_cart') AS add_to_carts -- Добавления в корзину
FROM dm.v_events_enriched
WHERE utm_source IS NOT NULL OR utm_medium IS NOT NULL
WHERE utm_source IS NOT NULL OR utm_medium IS NOT NULL -- Только с UTM-метками
GROUP BY event_date, utm_source, utm_medium, utm_campaign;