Files
clickstream-data-platform/docs/labs/1-2-top-pages-daily.md
T
ddadmin 4058e18864 docs(labs): упрощен язык учебных заданий
Зачем: помочь менти понять действия, проверить результат и оценить освоенное умение.

Что: вычитаны 13 заданий основной программы и общий индекс. Итоговые списки обращены к учащемуся, убраны история разработки и повторы. Правила учебного текста записаны в программе, из AGENTS.md добавлена ссылка.

Проверка: git diff --check, локальные ссылки и ссылки на измененные заголовки прошли. Блоки кода и таблицы требований совпадают с исходными. Упражнения на стенде повторно не выполнялись: изменен только текст.
2026-09-13 11:01:35 -04:00

7.4 KiB
Raw Blame History

Задание 2: dm.top_pages_daily

Чему учит: собрать дневные показатели страниц и настроить их обновление в dm_transform через замену партиций.

Сначала прочитать

Для чего нужна витрина

По дневным показателям страниц аналитик сравнивает просмотры, посетителей и действия с товарами. Добавление в корзину происходит на карточке товара, покупка — на странице подтверждения заказа. Отношение добавлений к просмотрам карточки показывает ее конверсию.

Для воронки «просмотр → корзина → покупка» этих данных недостаточно: действия происходят на разных страницах, а связи между ними в агрегате нет. Путь человека исследуют по событиям или сессиям.

Что сделать

Источник — dds.event_v. Зерно витрины — день события × страница. Читайте DDS напрямую: так выполнение задания не зависит от витрины задания 1.

На стенде витрину с новым зерном хранят как готовый агрегат, чтобы не рассчитывать ее заново для каждого запроса. Причины описаны в разделе «Как принято на ступени 1». Создайте пять объектов: dm.top_pages_daily_rep / _dist, донор _stage_rep / _stage_dist и публичное представление dm.top_pages_daily_v. Ключ партиции — день, он же единица пересборки.

Состав колонок

Колонка Тип Значение
report_date Date День события
page_path LowCardinality(String) Путь страницы
pageviews UInt64 Число событий pageview на странице
visitors UInt64 Число разных client_id на странице
cart_adds UInt64 Число событий add_to_cart на странице
purchases UInt64 Число событий purchase на странице
_load_id String Идентификатор запуска, собравшего день
_load_ts DateTime64(3, 'UTC') Время сборки

Вычислите page_path из url, убрав домен и параметры запроса. Полный адрес разделил бы показатели одной страницы на сотни строк. Учитывайте все три типа событий, а их счетчики вычисляйте через countIf.

Ритм пересборки

События прожитого дня больше не меняются. Определяйте объем прогона по состоянию витрины: от первого несобранного прожитого дня до последнего прожитого. Отсчет от последнего собранного дня оставит пропуски после частичного сбоя.

Как у revenue_daily, заполните донор за весь диапазон одной вставкой, затем замените дневные партиции по одной.

Ключ шардирования

Выберите ключ самостоятельно. У revenue_daily кроме дня одно измерение с шестью близкими по объему значениями. Здесь страниц много, и число событий на них сильно различается.

У цели и донора используйте одинаковый ключ: иначе при замене партиции строка потеряется на одном шарде и удвоится на другом. О том, как устроен донор, читайте в разделе «Раскладка по шардам».

Типичная ошибка

Из-за имени витрины хочется отобрать только просмотры. Но фильтр источника по event_type = 'pageview' обнулит cart_adds и purchases, а запрос не завершится ошибкой. Конверсия карточек станет нулевой. Проверка одной суммы pageviews не обнаружит этот фильтр: все просмотры остались на месте. Ошибку покажет сверка purchases или cart_adds с источником, если за день были покупки или добавления в корзину.

Выбирайте проверку под возможную ошибку. Этот подход описан в справочнике проверок.

Как проверить себя

Деловой ключ — page_path внутри дня. Получите прямой агрегат из dds.event_v за день и соедините его с dm.top_pages_daily_v полным внешним соединением по ключу. Посчитайте строки, где ключ отсутствует с одной из сторон или различается любой из четырех счетчиков. Расхождений должно быть ноль.

Перед полным сравнением проверьте дневные суммы:

  • сумма pageviews равна числу событий pageview в dds.event_v;
  • сумма purchases равна числу событий purchase в том же источнике.

Сумма visitors по страницам повторно учитывает посетителя, открывшего несколько страниц. Число посетителей за день берите из dm.daily_traffic_v.

Что должно получиться

  • у вас есть пять объектов витрины; донор объявлен через AS и использует тот же ключ шардирования, что и целевая таблица;
  • вы явно перечислили колонки в dm.top_pages_daily_v, включая _load_id и _load_ts;
  • ваш запрос сам определяет дни пересборки по состоянию витрины;
  • вы запустили top_pages_daily в homework_check, проверка успешна;
  • вы включили витрину в dm_transform и убедились, что повторный прогон конвейера не меняет результат.