Files
clickstream-data-platform/sql/dq/sessions_vs_reference.sql
ddadmin 54686651df fix(dq): устранено переполнение памяти проверок
- Зачем:
  - параллельный DQ выгружал деловые ключи в Python и исчерпывал 640 МиБ планировщика.
- Что:
  - четыре сверки агрегируют дневные итоги и ограниченную диагностику в ClickHouse.
  - коробка планировщика поднята до 1,5 ГиБ, локальные пределы задач удалены.
  - измерения и граница между SQL и Python записаны в документации.
- Проверка:
  - make lint, make config-test, make smoke, make check-clickhouse, make check-services.
  - полный etl_pipeline, красный и восстановительный прогоны dq_check.
2026-08-27 11:25:19 -04:00

66 lines
2.3 KiB
SQL

-- DQ: эталонная сессия Метрики против сессии, нарезанной слоем DDS.
--
-- Сопоставление идет по куке внутри завершенного дня: лишняя сессия одной
-- куки не скрывает потерянную сессию другой. Результат содержит итог дня.
WITH
(SELECT min(EventDate) FROM ods.event_v) AS first_source_day,
first_source_day + ({position:UInt16} - 1) AS last_lived_day,
reference AS
(
SELECT
EventDate AS data_date,
ClientID AS client_id,
uniqExact(VisitID) AS sessions
FROM ods.event_v
WHERE EventDate <= last_lived_day
GROUP BY
data_date,
client_id
),
actual AS
(
SELECT
session_date AS data_date,
client_id,
count() AS sessions
FROM dds.session_v
WHERE session_date <= last_lived_day
GROUP BY
data_date,
client_id
),
comparison AS
(
SELECT
coalesce(reference.data_date, actual.data_date) AS data_date,
toString(coalesce(reference.client_id, actual.client_id)) AS business_key,
isNotNull(reference.client_id) AS reference_present,
isNotNull(actual.client_id) AS actual_present,
toString(reference.sessions) AS reference_value,
toString(actual.sessions) AS actual_value,
NOT isNotDistinctFrom(reference.sessions, actual.sessions) AS failed
FROM reference
GLOBAL FULL OUTER JOIN actual USING (data_date, client_id)
)
SELECT
data_date,
countIf(reference_present) AS reference_rows,
countIf(actual_present) AS actual_rows,
countIf(failed) AS failed_rows,
groupArrayIf(20)(
concat(
toString(data_date),
' key=',
business_key,
': эталон=',
if(reference_present, reference_value, 'нет ключа'),
', объект=',
if(actual_present, actual_value, 'нет ключа')
),
failed
) AS diagnostics
FROM comparison
GROUP BY data_date
ORDER BY data_date
SETTINGS join_use_nulls = 1