Files
clickstream-data-platform/sql/dq/daily_traffic_vs_dds.sql
T
ddadmin 26b2e5fea1 feat(dq): добавлен контроль качества конвейера
- Зачем:
  - конвейеру нужна публикуемая сводка текущего качества с красным завершением при нарушении договоров.
- Что:
  - добавлены DDL, публичное представление и пять сверок на естественном деловом зерне.
  - даг dq_check встроен после DM и публикует полные дневные партиции до именованных утверждений.
  - параллелизм DDS, DM и DQ приведён к измеренному лимиту памяти планировщика.
- Проверка:
  - make lint; make config-test; make rebuild-storage.
  - make smoke; make check-clickhouse; make check-services.
  - три семейства проверок покрашены искусственными расхождениями и восстановлены повторным полным прогоном.
2026-08-27 07:55:28 -04:00

47 lines
1.9 KiB
SQL

-- DQ: дневной трафик против прямого агрегата сессий и карты идентичностей.
--
-- Публичные представления скрывают физическую ко-локацию, поэтому GLOBAL
-- назван явно, как в самой витрине. Полное объединение не прячет день,
-- исчезнувший с любой стороны.
WITH
reference AS
(
SELECT
sessions.session_date AS report_date,
uniqExact(sessions.client_id) AS visitors,
uniqExactIf(identities.user_id, identities.user_id != 0) AS known_users
FROM dds.session_v AS sessions
GLOBAL LEFT JOIN dds.identity_map_v AS identities USING (client_id)
GROUP BY report_date
),
actual AS
(
SELECT
report_date,
count() AS physical_rows,
any(visitors) AS visitors,
any(known_users) AS known_users
FROM dm.daily_traffic_v
GROUP BY report_date
)
SELECT
coalesce(reference.report_date, actual.report_date) AS data_date,
toString(coalesce(reference.report_date, actual.report_date)) AS business_key,
isNotNull(reference.report_date) AS reference_present,
isNotNull(actual.report_date) AS actual_present,
toString(tuple(reference.visitors, reference.known_users)) AS reference_value,
concat(
toString(tuple(actual.visitors, actual.known_users)),
', rows=',
toString(actual.physical_rows)
) AS actual_value,
isNull(reference.report_date)
OR isNull(actual.report_date)
OR actual.physical_rows != 1
OR NOT isNotDistinctFrom(reference.visitors, actual.visitors)
OR NOT isNotDistinctFrom(reference.known_users, actual.known_users) AS failed
FROM reference
GLOBAL FULL OUTER JOIN actual USING (report_date)
ORDER BY data_date
SETTINGS join_use_nulls = 1