Files
clickstream-data-platform/docs/labs/README.md
T
ddadmin 3556566f64 docs(labs): обращение «вы» во всех учебных заданиях
- Зачем:
  - README и путеводитель обращаются к читателю на «вы», а ТЗ в docs/labs/
    были на «ты»; после пересборки индекса смесь стала заметна.
- Что:
  - во всех восьми файлах docs/labs/ местоимения, глаголы и повелительное
    наклонение переведены во второе лицо множественного числа.
  - названия ступеней в таблице README оставлены как в спеке.
- Проверка:
  - grep по формам «ты/твой», 'ё' и 'менти' по docs/labs/ молчит;
    git diff --check чистый; ревью диффа свежей сессией.
2026-09-03 17:28:51 -04:00

12 KiB

Учебные задания

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

Основная программа

Ступень Задание Чему учит
1 Пять витрин слоя DM построить результат для потребителя хранилища; уроки каждой витрины — в таблице ниже
2 Свой график в Superset превратить свой результат из хранилища в отчет в BI
3 Нарежь сессии сам счет показывает проблему, но причину приходится искать в отдельных строках
4 Перепиши нарезку стенда изменить расчетную сущность внутри готового конвейера и проверить ее внешним эталоном
5 Сначала сторож, потом ломай: заказы построить сторожей до рискованного изменения, а не после первой поломки
6 Разбери сырые события и сверь результат со стендом изучить разбор потока отдельно от живого приема и сверить его со стендовым результатом
7 Мониторинг: куда смотреть выбрать, куда и на что смотреть в живой системе

ТЗ для ступеней 3–7 появятся по мере продвижения программы.

Ступень 1: пять витрин слоя DM

Слой DM в стенде построен наполовину: витрины трех сюжетов дашборда и контроль качества уже построены, остальные пять витрин строите вы. Каждая из них — самостоятельное ТЗ: в нем есть состав витрины, зерно, источники и способ проверки.

№ Результат Чему учит
1 events_enriched_v слой — это контракт, а не копия данных
2 top_pages_daily зерно сменилось — витрина материализуется и встает в конвейер
3 session_overview зерно решает, на какие вопросы витрина уже не ответит
4 dq_errors_daily у брака свой день и свой срок жизни
5 utm_effectiveness declared_ в имени — предупреждение, а не украшение

Общее устройство слоя — дока DM. Она отвечает на вопросы «почему так», задание отвечает на вопрос «что сделать».

Общие правила ступени 1

Они одни для пяти заданий по витринам ступени 1, поэтому записаны здесь, а не повторяются в каждом ТЗ.

Читать — через _v. Публичный договор сущности DDS — представление с суффиксом _v: dds.event_v, dds.session_v. Витрина называет только его; физические _rep и _dist служат загрузке и обслуживанию. Соседнюю домашку витрина источником тоже не берет: витрина слоя DM читает договор DDS, и задания остаются независимыми. Исключение одно и оно оговорено в задании 4: у таблиц брака публичного договора нет.

Писать — только в _dist. При записи в локальную таблицу раскладку определяет то, какая нода случайно выполняла код, а не свойство данных. Правило и его следствия — дока хранилища, «Раскладка по шардам».

Форма — по зерну. Витрина, меняющая зерно источника, материализуется: dm.<имя>_rep / _dist, донор dm.<имя>_stage_rep / _stage_dist и публичное dm.<имя>_v с явным списком колонок. Витрина, сохраняющая зерно, остается обычным представлением. Довод — дока DM, «Форма: по зерну, не по цене запроса».

Ключ шардирования — ваше решение. Ни одно ТЗ ключа не называет. Правило выбора и требование к донору — дока хранилища, «Раскладка по шардам»: донор объявляется через AS <цель>_rep и шардируется тем же ключом, что цель, иначе замена партиции потеряет строку на одном шарде и задвоит на другом. Названный ключ надо уметь защитить: почему он не дает перекоса и почему более сложный тут ничего не добавляет. Образец такой защиты — dm.revenue_daily_dist в sql/ddl/55-dm-tables.sql.

Где лежит код. DDL домашек — свой файл sql/ddl/70-labs.sql: он применяется после стендовых по порядку имени, и ваши объекты не мешаются со стендовыми. У агрегатов рядом со стендовыми ложатся еще три запроса — sql/dm/<витрина>_scope.sql спрашивает у хранилища, какие дни пересобирает запуск, _rebuild.sql собирает их в донор, _replace.sql заменяет партицию, — и задача в dags/dm_transform.py. У разминочного представления нет ничего из этого: весь его код — одно CREATE VIEW.

Образец на все случаи — витрина revenue_daily: у нее есть все пять объектов, донор, сборка, замена дневных партиций и задача в конвейере. Списывать с нее устройство можно и нужно; списывать состав колонок — нет, он у каждой витрины свой.

Самопроверка ступени 1

Даг homework_check запускается рукой, расписания у него нет. Задача витрины красная, пока витрины нет или счет не сходится, и зеленая, когда собрано верно. В сводку качества конвейера dm.dq_summary он не пишет: это инструмент лабы, а не история качества стенда.

Проверка пяти заданий по витринам устроена одинаково и золотых констант не содержит: рядом с витриной независимым запросом собирается тот же ответ — прямо из источника витрины, минуя ее саму. У четырех заданий источник эталона тот же, что у витрины, dds.session_v или dds.event_v; у задания 4 это таблицы брака ODS, потому что в DDS у брака представительства нет. Обе стороны соединяются по деловому ключу через FULL OUTER JOIN, и считается число строк, где стороны разошлись или одной стороны нет. Ноль — зеленый. Полное соединение здесь обязательно: при обычном пропавший день или пропавший ключ просто не попал бы в результат и остался бы незамечен.

Раздел «Как проверить себя» каждого ТЗ по витрине называет деловой ключ и сравниваемые величины. Тот же прием в стендовом исполнении — даг dq_check и запросы в sql/dq/.

Предупреждение. Запросы самой проверки лежат в sql/dq/ открыто, и имена называют витрину и роль сверки. Проверка на инвариантах неизбежно близка к ответу: чтобы сверить витрину, надо ее пересчитать. Прятать эти файлы никто не станет — но открыв их до того, как задание сделано, вы обменяете урок на готовый SQL. Смотреть туда стоит после своей сборки: сравнить два решения полезно, списать одно — нет.

Факультативы

Эти задания вы берете по желанию. Полный список сюжетов — в разделе «Факультативы — пять разделов» программы.

Почему выручка не сходится

Открывается после ступени 1. Расхождения между источниками, повторы покупок и день, после которого отчет можно считать окончательным.

Тонкий анализ данных

Открывается после ступени 1. Знание о пользователе на дату и обогащение отчета своим словарем.

Superset и BI

Открывается после ступени 2. Свой дашборд в Superset: свои объекты BI живут отдельно от стендовых.

Инженерия стенда

Открывается после ступени 1. Прием и хранение данных, раскладка по шардам, повторная обработка дня и обновление витрин.

Что делать, когда стенд сломался

Открывается после ступени 7. Поломки стенда и runbook по итогам расследований; весь раздел — повышенная сложность.

Уборка

Черновики и опыты за собой сносить: правило проверок стенда — дока тестирования. Снесенная витрина обязана снова покраснить свою задачу в homework_check — если не покраснила, проверка ничего и не проверяла.