docs(labs): упрощен язык учебных заданий
- Зачем: начинающим трудно читать задания из-за необъясненных терминов и неестественных формулировок. - Что: переработаны вводная и 21 задание, названы темы разделов, объяснены термины и сокращены повторы; согласованы правила учебного текста и ссылки. - Проверка: сохранены 25 блоков SQL и команд и таблицы состава колонок; проверены 153 локальные ссылки и 32 входящие ссылки на разделы; git diff --check прошел.
This commit is contained in:
1 parent
3c3eb825e1
commit
4693bc5af9
24 files changed
+782
-684
No files matched your search
@@ -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`;
|
||||
- [ ] ваш запрос сам определяет дни пересборки по состоянию витрины;
|
||||
|
||||
Reference in new issue
Block a user