diff --git a/docs/labs/3-1-sessions-by-hand.md b/docs/labs/3-1-sessions-by-hand.md new file mode 100644 index 0000000..f991ad5 --- /dev/null +++ b/docs/labs/3-1-sessions-by-hand.md @@ -0,0 +1,89 @@ +# Нарежь сессии сам + +**Чему учит:** собрать сессии из событий и сверить их число с внешним +эталоном. Найти причину расхождения в отдельных строках. + +## Сначала прочитать + +- [Хранилище и его слои, раздел DDS](../handbook/storage-layers.md#dds-язык-бизнеса); +- [формат события: Идентификаторы и время](../formats/clickstream-event.md#идентификаторы-и-время). + +## Роль сессии + +Визит, или сессия, объединяет действия посетителя за один заход на сайт. +По визитам аналитик считает длительность и глубину просмотра. +В хранилище сессии собираются из отдельных событий. +Сверьте самостоятельный расчет с `VisitID`, чтобы увидеть, как из событий +получается сессия. + +## Что сделать + +### Нарезка + +В SQL Lab или DBeaver под `analyst` напишите запрос к `ods.event_v`. +Для своей нарезки и эталона возьмите одни и те же строки за все доступные +дни: для расследования понадобятся события соседних дней. +Выберите `ClientID`, `UTCEventTime`, `EventDate`, `EventType` и `VisitID`. +В `dds.event_v` эталонного `VisitID` нет. + +Для начала считайте визитом последовательные события одной куки (`ClientID`); +пауза дольше 30 минут открывает новый визит. +Учитывайте события всех типов. Упорядочите их по `UTCEventTime`. +Присвойте каждому событию номер своей сессии внутри куки. +Подсказка: оконные функции. + +Днем сессии считайте `EventDate` ее первого события: дата из `UTCEventTime` +отличается от `EventDate` для части событий, поэтому берите `EventDate`. +При сверке останутся расхождения из-за еще одной договоренности стенда. + +### Сверка с эталоном + +В эталоне посчитайте число визитов каждой куки за модельный день: + +```sql +SELECT ClientID, EventDate, uniqExact(VisitID) AS reference_sessions +FROM ods.event_v +GROUP BY ClientID, EventDate +ORDER BY EventDate, ClientID; +``` + +Посчитайте свои сессии по куке и дню сессии. +Соедините два готовых агрегата через `FULL OUTER JOIN` по куке и дню. +В результате полного соединения останутся ключи обеих сторон: при расхождении +на вашей стороне ключа может не быть совсем. Учтите такие строки при сравнении. +Выведите сводку по дням с числом разошедшихся кук и список этих кук +с днем и обоими значениями счета. Общая сумма за день могла бы скрыть +взаимную компенсацию ошибок разных кук. По списку видно, у кого искать причину. + +Расхождений будет всего несколько. Если их нет, мир прожил мало дней. +Прогоните несколько дней через [даги модельного времени](../handbook/airflow-dags.md#даги-мира) +и повторите сверку. + +### Расследование + +Выберите одну разошедшуюся куку. Выведите ее события за два соседних дня +с `UTCEventTime`, `EventDate`, `VisitID` и номером своей сессии. +Сопоставьте сессии через события: общего ключа у двух нарезок нет, +зато у каждого события есть и `VisitID`, и присвоенный вами номер. +Найдите два соседних события, между которыми границы визитов разошлись. +Запишите куку, день, время обоих событий и причину одним предложением. +Уточните определение визита и добейтесь нуля расхождений во всех днях. + +## Как проверить себя + +Результат задания проверяется глазами, поэтому задачи в `homework_check` +для него нет. Таблицы и представления создавать не нужно. +Сохраните исходный и уточненный расчеты, результаты сверки и найденные строки. + +**Предупреждение.** В `sql/dds/session_rebuild.sql` и +`sql/dq/sessions_vs_reference.sql` лежат готовые запросы нарезки и сверки. +Откройте их после собственного решения и расследования. Сравните запросы +со своими: копирование готового SQL пропускает расследование. +Сопоставление со стендовой нарезкой по `session_id` остается на ступень 4. + +## Приемка + +- [ ] запрос нарезает все события `ods.event_v` за все доступные дни; +- [ ] сверка через `FULL OUTER JOIN` дает сводку по дням и список кук; +- [ ] при разборе расхождения указаны кука, день, два события и причина; +- [ ] уточненный расчет дает ноль расхождений во всех днях. diff --git a/docs/labs/README.md b/docs/labs/README.md index b741c46..ceb5b54 100644 --- a/docs/labs/README.md +++ b/docs/labs/README.md @@ -10,13 +10,13 @@ |---|---|---| | 1 | Пять витрин слоя DM | построить результат для потребителя хранилища; уроки каждой витрины — в таблице ниже | | 2 | [Свой график в Superset](2-1-superset-chart.md) | превратить свой результат из хранилища в отчет в BI | -| 3 | Нарежь сессии сам | сравнить свою нарезку визитов с эталоном по числу сессий и найти причину расхождения в отдельных событиях | +| 3 | [Нарежь сессии сам](3-1-sessions-by-hand.md) | сверить число сессий в своей нарезке с эталоном и найти события, из-за которых оно расходится | | 4 | Перепиши нарезку стенда | изменить расчетную сущность внутри готового конвейера и проверить ее внешним эталоном | | 5 | Сначала сторож, потом ломай: заказы | написать проверки качества до рискованного изменения, а не после первой поломки | | 6 | Разбери сырые события и сверь результат со стендом | изучить разбор потока отдельно от живого приема и сверить его со стендовым результатом | | 7 | Мониторинг: куда смотреть | выбрать, куда и на что смотреть в живой системе | -ТЗ для ступеней 3–7 появятся по мере продвижения программы. +ТЗ для ступеней 4-7 появятся по мере продвижения программы. ## Ступень 1: пять витрин слоя DM