docs(labs): упрощен язык учебных заданий

- Зачем: начинающим трудно читать задания из-за необъясненных терминов и неестественных формулировок.
- Что: переработаны вводная и 21 задание, названы темы разделов, объяснены термины и сокращены повторы; согласованы правила учебного текста и ссылки.
- Проверка: сохранены 25 блоков SQL и команд и таблицы состава колонок; проверены 153 локальные ссылки и 32 входящие ссылки на разделы; git diff --check прошел.
This commit is contained in:
ddadmin committed 2026-10-18 18:09:43 +02:00
1 parent 3c3eb825e1
commit 4693bc5af9
24 files changed
+782 -684

No files matched your search

+46 -37
View File
@@ -1,14 +1,15 @@
# Задание 3: `dm.session_overview`
# Задание 3: визиты по устройствам, `dm.session_overview`
**Чему учит:** хранить слагаемые для расчета средних и долей и понимать,
Вы соберете дневные показатели визитов по устройствам. В таблице будут
храниться суммы и счетчики для расчета средних и долей. Заодно проверите,
когда сложение числа посетителей по устройствам завышает аудиторию.
## Сначала прочитать
## Подготовка
- [«Хранилище и его слои»](../handbook/storage-layers.md);
- [«Потоки Airflow и даги модельного времени»](../handbook/airflow-dags.md).
## Для чего нужна витрина
## Показатели визитов
Витрина нужна, чтобы по дням сравнивать визиты с телефона и компьютера: их
число, длительность, просмотры страниц и частоту покупок.
@@ -17,13 +18,19 @@
устройствам. Почему такие итоги хранят в отдельной таблице, объясняет
[справочник DM](../architecture/dm.md).
## Что сделать
## Создание витрины
Источник — `dds.session_v`. Зерно — **день сессии × категория устройства**.
Зерно новое, поэтому витрина хранится готовым агрегатом — см. [«Как принято
на ступени 1»](README.md#как-принято-на-ступени-1). Создайте пять объектов:
`dm.session_overview_rep` / `_dist`, донор `_stage_rep` / `_stage_dist` и
публичное представление `dm.session_overview_v`. Ключ партиции — день.
Читайте готовые сессии из `dds.session_v`. В результате нужна одна строка
на категорию устройства за день: например, итоги всех визитов с телефонов
за один день.
Создайте пять объектов по [общим правилам ступени 1](README.md#создание-и-обновление-витрин):
- основные таблицы `dm.session_overview_rep` и `dm.session_overview_dist`;
- промежуточные таблицы `dm.session_overview_stage_rep` и `dm.session_overview_stage_dist`;
- представление для чтения `dm.session_overview_v`.
Разбейте данные на партиции по дням.
### Состав колонок
@@ -47,19 +54,20 @@
категорий встречаются `desktop`, `mobile` и `tablet`. Строку для `tv`
создавайте только при появлении таких визитов.
Вместо `avg_duration_seconds` храните слагаемые. Среднее из средних по трем
устройствам даст неверный ответ за день: число сессий в категориях
различается, поэтому средние нужно взвешивать. Потребитель делит сумму
`duration_seconds_total` на сумму `sessions`. Долю отказов считают так же:
сумму `bounce_sessions` делят на сумму `sessions`, а не усредняют готовые
доли.
Для расчета средней длительности храните общую длительность и число сессий.
Готовую среднюю `avg_duration_seconds` сохранять не нужно. Число сессий
в категориях различается, поэтому среднее из трех средних даст неверный
ответ за день. Чтобы получить его правильно, разделите сумму
`duration_seconds_total` на сумму `sessions`. Для доли отказов разделите
сумму `bounce_sessions` на сумму `sessions`. Усреднение готовых долей тоже
даст неверный результат.
### Ритм пересборки
### Дни для пересчета
Сессии прожитого дня больше не меняются. Как в задании 2, определяйте
диапазон от первого несобранного прожитого дня до последнего прожитого.
Соберите его в донор и замените дневные партиции. Добавьте задачу в
`dm_transform`.
Сессии завершившегося модельного дня больше не меняются. Как в задании 2,
найдите первый завершившийся день, которого еще нет в витрине. Рассчитайте
все дни от него до последнего завершившегося, запишите их в промежуточную
таблицу и замените дневные партиции основной. Добавьте задачу в `dm_transform`.
### Ключ шардирования
@@ -68,18 +76,18 @@
`device_category`, сначала посчитайте строки на каждом шарде. Затем
объясните, почему такое распределение вас устраивает.
Ключ донора — тот же, что у цели (см. [«Как принято на ступени
1»](README.md#как-принято-на-ступени-1) и раздел «Раскладка по шардам»
[справочника хранилища](../architecture/storage.md)).
У основной и промежуточной таблиц должен быть одинаковый ключ шардирования:
см. [общие правила ступени 1](README.md#создание-и-обновление-витрин).
## Почему сумма `visitors` сходится с `dm.daily_traffic_v`
## Число посетителей за день
Сравните сумму `visitors` по устройствам за день с `dm.daily_traffic_v`. На
стенде значения совпадут: устройство приписано куке на всю жизнь, поэтому за
день она учитывается только в одной строке. Это свойство мира стенда; см.
стенде значения совпадут: одному `client_id` всегда соответствует одно
устройство, поэтому за день он учитывается только в одной категории.
Это свойство мира стенда; см.
раздел «Паспорт куки» в [словаре понятий](../../CONTEXT.md).
Если появятся визиты одной куки с двух устройств, сумма начнет завышать
Если появятся визиты одного `client_id` с двух устройств, сумма начнет завышать
аудиторию. Проверки счетчиков по категориям этого не обнаружат. Число
посетителей дня берите из `dm.daily_traffic_v`, где оно рассчитано для дня
целиком.
@@ -91,12 +99,13 @@
событий совпало с источником, а число сессий завышено, вероятная причина —
сборка витрины из событий вместо сессий.
## Как проверить себя
## Проверка результата
Деловой ключ — `device_category` внутри дня. Получите прямой агрегат из
`dds.session_v` за день. Соедините его с `dm.session_overview_v` полным
внешним соединением по ключу. Посчитайте строки, где ключ отсутствует с
одной из сторон или различается любой счетчик. Расхождений должно быть ноль.
Рассчитайте те же показатели по `dds.session_v` за выбранный день.
Сопоставьте результат со строками `dm.session_overview_v` за этот день
через `FULL OUTER JOIN` по `device_category`. Найдите категории, которые
есть только с одной стороны, и строки, где различается хотя бы один
счетчик. Расхождений должно быть ноль.
Еще две проверки дневных итогов:
@@ -104,12 +113,12 @@
повторного учета визитов;
- сумма `events_total` равна сумме `events_total` по сессиям того же дня.
## Что должно получиться
## Результат работы
- [ ] у вас есть пять объектов витрины; донор объявлен через `AS` и
использует ключ шардирования целевой таблицы;
- [ ] у вас есть пять объектов витрины; промежуточная таблица объявлена через
`AS` и использует ключ шардирования основной;
- [ ] вы явно перечислили колонки в `dm.session_overview_v` и собрали
показатели из готовых сессий `dds.session_v`;
- [ ] в таблице хранятся слагаемые для средних и долей;
- [ ] в таблице хранятся суммы и счетчики для расчета средних и долей;
- [ ] проверка `session_overview` в `homework_check` прошла успешно;
- [ ] витрина обновляется при запуске `dm_transform`.