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

+44 -38
View File
@@ -1,14 +1,15 @@
# Задание 2: `dm.top_pages_daily`
# Задание 2: показатели страниц по дням, `dm.top_pages_daily`
**Чему учит:** собрать дневные показатели страниц и настроить их
обновление в `dm_transform` через замену партиций.
В этой работе вы рассчитаете показатели страниц за каждый день и сохраните
их в таблице. Затем подключите обновление витрины к `dm_transform`:
новый расчет будет заменять дневные партиции таблицы.
## Сначала прочитать
## Подготовка
- [«Хранилище и его слои»](../handbook/storage-layers.md);
- [«Потоки Airflow и даги модельного времени»](../handbook/airflow-dags.md).
## Для чего нужна витрина
## Дневные показатели страниц
По дневным показателям страниц аналитик сравнивает просмотры, посетителей и
действия с товарами. Добавление в корзину происходит на карточке товара,
@@ -19,19 +20,23 @@
действия происходят на разных страницах, а связи между ними в агрегате нет.
Путь человека исследуют по событиям или сессиям.
## Что сделать
## Создание витрины
Источник — `dds.event_v`. Зерно витрины — **день события × страница**.
Читайте DDS напрямую: так выполнение задания не зависит от витрины
задания 1.
Читайте события из `dds.event_v`. В результате нужна одна строка на страницу
за день. Например, все просмотры одной карточки товара за один день попадут
в одну строку. Витрина задания 1 для этого расчета не нужна.
На стенде витрину с новым зерном хранят как готовый агрегат, чтобы не
рассчитывать ее заново для каждого запроса. Причины описаны в разделе
[«Как принято на ступени 1»](README.md#как-принято-на-ступени-1). Создайте
пять объектов:
`dm.top_pages_daily_rep` / `_dist`, донор `_stage_rep` / `_stage_dist` и
публичное представление `dm.top_pages_daily_v`. Ключ партиции — день, он же
единица пересборки.
Сохраните рассчитанные показатели в таблице, чтобы отчеты читали готовые
итоги. Создайте пять объектов:
- основные таблицы `dm.top_pages_daily_rep` и `dm.top_pages_daily_dist`;
- промежуточные таблицы `dm.top_pages_daily_stage_rep` и `dm.top_pages_daily_stage_dist`;
- представление для чтения `dm.top_pages_daily_v`.
Их назначение и порядок обновления разобраны во вводной:
[«Создание и обновление витрин»](README.md#создание-и-обновление-витрин).
Разбейте данные на партиции по дням, чтобы можно было заменить результат
одного дня целиком.
### Состав колонок
@@ -50,25 +55,26 @@
адрес разделил бы показатели одной страницы на сотни строк. Учитывайте все
три типа событий, а их счетчики вычисляйте через `countIf`.
### Ритм пересборки
### Дни для пересчета
События прожитого дня больше не меняются. Определяйте объем прогона по
состоянию витрины: от первого несобранного прожитого дня до последнего
прожитого. Отсчет от последнего собранного дня оставит пропуски после
частичного сбоя.
События завершившегося модельного дня больше не меняются. Найдите первый
такой день, которого еще нет в витрине, и рассчитайте все дни от него до
последнего завершившегося. Если начать после последнего дня, который уже
есть в витрине, можно пропустить более ранний день, не загруженный из-за сбоя.
Как у `revenue_daily`, заполните донор за весь диапазон одной вставкой,
затем замените дневные партиции по одной.
Как у `revenue_daily`, запишите расчет за все выбранные дни в промежуточную
таблицу одной вставкой. Затем замените дневные партиции основной таблицы по
одной. Добавьте запуск этих запросов в `dm_transform`.
### Ключ шардирования
Выберите ключ самостоятельно. У `revenue_daily` кроме дня одно измерение с
шестью близкими по объему значениями. Здесь страниц много, и число событий
на них сильно различается.
Выберите ключ самостоятельно. У `revenue_daily` строки сгруппированы по дню
и категории товара; категорий всего шесть. Здесь страниц много, и число
событий на них сильно различается.
У цели и донора используйте одинаковый ключ: иначе при замене партиции
строка потеряется на одном шарде и удвоится на другом. О том, [как устроен
донор](../architecture/storage.md), читайте в разделе «Раскладка по шардам».
У основной и промежуточной таблиц используйте одинаковый ключ шардирования.
Замена партиции не перераспределяет строки между шардами. Подробнее об этом
в разделе [«Раскладка по шардам»](../architecture/storage.md#раскладка-по-шардам).
## Типичная ошибка
@@ -82,13 +88,13 @@
Выбирайте проверку под возможную ошибку. Этот подход описан в
[справочнике проверок](../architecture/testing.md).
## Как проверить себя
## Проверка результата
Деловой ключ — `page_path` внутри дня. Получите прямой агрегат из
`dds.event_v` за день и соедините его с `dm.top_pages_daily_v` полным
внешним соединением по ключу. Посчитайте строки, где ключ отсутствует с
одной из сторон или различается любой из четырех счетчиков. Расхождений
должно быть ноль.
Рассчитайте те же показатели по `dds.event_v` за выбранный день.
Сопоставьте результат со строками `dm.top_pages_daily_v` за этот день
через `FULL OUTER JOIN` по `page_path`. Найдите страницы, которые есть
только с одной стороны, и строки, где различается хотя бы один из четырех
счетчиков. Расхождений должно быть ноль.
Перед полным сравнением проверьте дневные суммы:
@@ -98,10 +104,10 @@
Сумма `visitors` по страницам повторно учитывает посетителя, открывшего
несколько страниц. Число посетителей за день берите из `dm.daily_traffic_v`.
## Что должно получиться
## Результат работы
- [ ] у вас есть пять объектов витрины; донор объявлен через `AS` и
использует тот же ключ шардирования, что и целевая таблица;
- [ ] у вас есть пять объектов витрины; промежуточная таблица объявлена через
`AS` и использует тот же ключ шардирования, что и основная;
- [ ] в `dm.top_pages_daily_v` явно перечислены колонки, включая
`_load_id` и `_load_ts`;
- [ ] ваш запрос сам определяет дни пересборки по состоянию витрины;