Merge pull request 'docs(labs): ТЗ ступени 2 «Свой график в Superset» и порядок программы' (#227) from 226-superset-chart into main
Reviewed-on: #227
This commit was merged in pull request #227.
This commit is contained in:
commit
dc2cbc99dc
8 files changed
+203
-71
No files matched your search
+62
-21
@@ -1,21 +1,29 @@
|
|||||||
# Учебные задания: витрины слоя DM и дашборд в Superset
|
# Учебные задания
|
||||||
|
|
||||||
Пять домашних заданий — про витрины слоя DM. Стенд привозит слой
|
Программа состоит из двух частей: основная включает семь ступеней, которые вы
|
||||||
наполовину: витрины трех сюжетов дашборда и контроль качества построены,
|
проходите по порядку, а факультативы выбираете по желанию. Причины такого
|
||||||
остальные витрины строит менти. Каждое из них — самостоятельное ТЗ: что за
|
порядка и формы заданий описаны в [программе учебных лаб](../specs/2026-09-01-labs-program.md#2-устройство-программы-основная-программа-и-факультативы).
|
||||||
витрина, какое у нее зерно, из чего она собирается и как проверить, что
|
|
||||||
собралась верно.
|
|
||||||
|
|
||||||
Шестое задание — необязательная лаба в Superset. В ней менти собирает свой
|
## Основная программа
|
||||||
дашборд поверх пяти витрин.
|
|
||||||
|
|
||||||
Общее устройство слоя — [дока DM](../architecture/dm.md). Она отвечает на
|
| Ступень | Задание | Чему учит |
|
||||||
вопросы «почему так», задание отвечает на вопрос «что сделать».
|
|---|---|---|
|
||||||
|
| 1 | Пять витрин слоя DM | построить результат для потребителя хранилища; уроки каждой витрины — в таблице ниже |
|
||||||
|
| 2 | [Свой график в Superset](superset-chart.md) | превратить свой результат из хранилища в отчет в BI |
|
||||||
|
| 3 | Нарежь сессии сам | счет показывает проблему, но причину приходится искать в отдельных строках |
|
||||||
|
| 4 | Перепиши нарезку стенда | изменить расчетную сущность внутри готового конвейера и проверить ее внешним эталоном |
|
||||||
|
| 5 | Сначала сторож, потом ломай: заказы | построить сторожей до рискованного изменения, а не после первой поломки |
|
||||||
|
| 6 | Разбери сырые события и сверь результат со стендом | изучить разбор потока отдельно от живого приема и сверить его со стендовым результатом |
|
||||||
|
| 7 | Мониторинг: куда смотреть | выбрать, куда и на что смотреть в живой системе |
|
||||||
|
|
||||||
## Порядок
|
ТЗ для ступеней 3–7 появятся по мере продвижения программы.
|
||||||
|
|
||||||
Задания идут по нарастанию: каждое следующее опирается на то, что уже
|
## Ступень 1: пять витрин слоя DM
|
||||||
усвоено.
|
|
||||||
|
Слой DM в стенде построен наполовину: витрины трех сюжетов дашборда и контроль
|
||||||
|
качества уже построены, остальные пять витрин строите вы. Каждая из них —
|
||||||
|
самостоятельное ТЗ: в нем есть состав витрины, зерно, источники и способ
|
||||||
|
проверки.
|
||||||
|
|
||||||
| № | Результат | Чему учит |
|
| № | Результат | Чему учит |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -24,11 +32,13 @@
|
|||||||
| 3 | [`session_overview`](session-overview.md) | зерно решает, на какие вопросы витрина уже не ответит |
|
| 3 | [`session_overview`](session-overview.md) | зерно решает, на какие вопросы витрина уже не ответит |
|
||||||
| 4 | [`dq_errors_daily`](dq-errors-daily.md) | у брака свой день и свой срок жизни |
|
| 4 | [`dq_errors_daily`](dq-errors-daily.md) | у брака свой день и свой срок жизни |
|
||||||
| 5 | [`utm_effectiveness`](utm-effectiveness.md) | `declared_` в имени — предупреждение, а не украшение |
|
| 5 | [`utm_effectiveness`](utm-effectiveness.md) | `declared_` в имени — предупреждение, а не украшение |
|
||||||
| 6 | [Свой дашборд в Superset](superset-dashboard.md) — необязательная лаба | свои объекты BI живут отдельно от стендовых |
|
|
||||||
|
|
||||||
## Общие правила
|
Общее устройство слоя — [дока DM](../architecture/dm.md). Она отвечает на
|
||||||
|
вопросы «почему так», задание отвечает на вопрос «что сделать».
|
||||||
|
|
||||||
Они одни для пяти заданий по витринам, поэтому записаны здесь, а не
|
## Общие правила ступени 1
|
||||||
|
|
||||||
|
Они одни для пяти заданий по витринам ступени 1, поэтому записаны здесь, а не
|
||||||
повторяются в каждом ТЗ.
|
повторяются в каждом ТЗ.
|
||||||
|
|
||||||
**Читать — через `_v`.** Публичный договор сущности DDS — представление с
|
**Читать — через `_v`.** Публичный договор сущности DDS — представление с
|
||||||
@@ -49,7 +59,7 @@ DDS, и задания остаются независимыми. Исключе
|
|||||||
остается обычным представлением. Довод — [дока DM](../architecture/dm.md),
|
остается обычным представлением. Довод — [дока DM](../architecture/dm.md),
|
||||||
«Форма: по зерну, не по цене запроса».
|
«Форма: по зерну, не по цене запроса».
|
||||||
|
|
||||||
**Ключ шардирования — твое решение.** Ни одно ТЗ ключа не называет.
|
**Ключ шардирования — ваше решение.** Ни одно ТЗ ключа не называет.
|
||||||
Правило выбора и требование к донору — [дока
|
Правило выбора и требование к донору — [дока
|
||||||
хранилища](../architecture/storage.md), «Раскладка по шардам»: донор
|
хранилища](../architecture/storage.md), «Раскладка по шардам»: донор
|
||||||
объявляется через `AS <цель>_rep` и шардируется тем же ключом, что цель,
|
объявляется через `AS <цель>_rep` и шардируется тем же ключом, что цель,
|
||||||
@@ -59,7 +69,7 @@ DDS, и задания остаются независимыми. Исключе
|
|||||||
`dm.revenue_daily_dist` в [`sql/ddl/55-dm-tables.sql`](../../sql/ddl/55-dm-tables.sql).
|
`dm.revenue_daily_dist` в [`sql/ddl/55-dm-tables.sql`](../../sql/ddl/55-dm-tables.sql).
|
||||||
|
|
||||||
**Где лежит код.** DDL домашек — свой файл `sql/ddl/70-labs.sql`: он
|
**Где лежит код.** DDL домашек — свой файл `sql/ddl/70-labs.sql`: он
|
||||||
применяется после стендовых по порядку имени, и твои объекты не мешаются
|
применяется после стендовых по порядку имени, и ваши объекты не мешаются
|
||||||
со стендовыми. У агрегатов рядом со стендовыми ложатся еще три запроса —
|
со стендовыми. У агрегатов рядом со стендовыми ложатся еще три запроса —
|
||||||
`sql/dm/<витрина>_scope.sql` спрашивает у хранилища, какие дни пересобирает
|
`sql/dm/<витрина>_scope.sql` спрашивает у хранилища, какие дни пересобирает
|
||||||
запуск, `_rebuild.sql` собирает их в донор, `_replace.sql` заменяет
|
запуск, `_rebuild.sql` собирает их в донор, `_replace.sql` заменяет
|
||||||
@@ -72,7 +82,7 @@ DDS, и задания остаются независимыми. Исключе
|
|||||||
Списывать с нее устройство можно и нужно; списывать состав колонок — нет,
|
Списывать с нее устройство можно и нужно; списывать состав колонок — нет,
|
||||||
он у каждой витрины свой.
|
он у каждой витрины свой.
|
||||||
|
|
||||||
## Самопроверка
|
## Самопроверка ступени 1
|
||||||
|
|
||||||
Даг `homework_check` запускается рукой, расписания у него нет. Задача
|
Даг `homework_check` запускается рукой, расписания у него нет. Задача
|
||||||
витрины красная, пока витрины нет или счет не сходится, и зеленая, когда
|
витрины красная, пока витрины нет или счет не сходится, и зеленая, когда
|
||||||
@@ -96,11 +106,42 @@ DDS, и задания остаются независимыми. Исключе
|
|||||||
**Предупреждение.** Запросы самой проверки лежат в `sql/dq/` открыто, и
|
**Предупреждение.** Запросы самой проверки лежат в `sql/dq/` открыто, и
|
||||||
имена называют витрину и роль сверки. Проверка на инвариантах неизбежно
|
имена называют витрину и роль сверки. Проверка на инвариантах неизбежно
|
||||||
близка к ответу: чтобы сверить витрину, надо ее пересчитать. Прятать эти
|
близка к ответу: чтобы сверить витрину, надо ее пересчитать. Прятать эти
|
||||||
файлы никто не станет — но открыв их до того, как задание сделано, ты
|
файлы никто не станет — но открыв их до того, как задание сделано, вы
|
||||||
обменяешь урок на готовый SQL.
|
обменяете урок на готовый SQL.
|
||||||
Смотреть туда стоит после своей сборки: сравнить два решения полезно,
|
Смотреть туда стоит после своей сборки: сравнить два решения полезно,
|
||||||
списать одно — нет.
|
списать одно — нет.
|
||||||
|
|
||||||
|
## Факультативы
|
||||||
|
|
||||||
|
Эти задания вы берете по желанию. Полный список сюжетов — в разделе
|
||||||
|
[«Факультативы — пять разделов»](../specs/2026-09-01-labs-program.md#4-факультативы--пять-разделов)
|
||||||
|
программы.
|
||||||
|
|
||||||
|
### Почему выручка не сходится
|
||||||
|
|
||||||
|
Открывается после ступени 1. Расхождения между источниками, повторы
|
||||||
|
покупок и день, после которого отчет можно считать окончательным.
|
||||||
|
|
||||||
|
### Тонкий анализ данных
|
||||||
|
|
||||||
|
Открывается после ступени 1. Знание о пользователе на дату и обогащение
|
||||||
|
отчета своим словарем.
|
||||||
|
|
||||||
|
### Superset и BI
|
||||||
|
|
||||||
|
Открывается после ступени 2. [Свой дашборд в Superset](superset-dashboard.md):
|
||||||
|
свои объекты BI живут отдельно от стендовых.
|
||||||
|
|
||||||
|
### Инженерия стенда
|
||||||
|
|
||||||
|
Открывается после ступени 1. Прием и хранение данных, раскладка по шардам,
|
||||||
|
повторная обработка дня и обновление витрин.
|
||||||
|
|
||||||
|
### Что делать, когда стенд сломался
|
||||||
|
|
||||||
|
Открывается после ступени 7. Поломки стенда и runbook по итогам
|
||||||
|
расследований; весь раздел — повышенная сложность.
|
||||||
|
|
||||||
## Уборка
|
## Уборка
|
||||||
|
|
||||||
Черновики и опыты за собой сносить: правило проверок стенда —
|
Черновики и опыты за собой сносить: правило проверок стенда —
|
||||||
|
|||||||
@@ -67,7 +67,7 @@
|
|||||||
марта удалены.
|
марта удалены.
|
||||||
|
|
||||||
Отсюда правило прогона: пересобираются **только те дни загрузки, которые
|
Отсюда правило прогона: пересобираются **только те дни загрузки, которые
|
||||||
еще есть в источнике**. Спроси у источника список живых дней и замени
|
еще есть в источнике**. Спросите у источника список живых дней и замените
|
||||||
партиции ровно этих дней. Соблазн «собрать все заново в донор и подменить
|
партиции ровно этих дней. Соблазн «собрать все заново в донор и подменить
|
||||||
таблицу целиком» здесь стоит дороже обычного: истекшие по `TTL` дни исчезли
|
таблицу целиком» здесь стоит дороже обычного: истекшие по `TTL` дни исчезли
|
||||||
бы из витрины навсегда, а вместе с ними — единственная оставшаяся память о
|
бы из витрины навсегда, а вместе с ними — единственная оставшаяся память о
|
||||||
@@ -79,9 +79,9 @@
|
|||||||
|
|
||||||
## Ключ шардирования
|
## Ключ шардирования
|
||||||
|
|
||||||
Твое решение по [правилу донора](../architecture/storage.md), «Раскладка по
|
Ваше решение по [правилу донора](../architecture/storage.md), «Раскладка по
|
||||||
шардам». Витрина крошечная: классов брака у событий и заказов вместе меньше
|
шардам». Витрина крошечная: классов брака у событий и заказов вместе меньше
|
||||||
десятка. Учти это в защите ключа — иногда правильный ответ звучит как
|
десятка. Учтите это в защите ключа — иногда правильный ответ звучит как
|
||||||
«перекос здесь ничего не стоит, и вот почему».
|
«перекос здесь ничего не стоит, и вот почему».
|
||||||
|
|
||||||
## Как проверить себя
|
## Как проверить себя
|
||||||
@@ -91,8 +91,8 @@
|
|||||||
день за границей `TTL` сверять не с чем, и его отсутствие в источнике не
|
день за границей `TTL` сверять не с чем, и его отсутствие в источнике не
|
||||||
ошибка.
|
ошибка.
|
||||||
|
|
||||||
Собери прямой счет по обеим таблицам ошибок, соедини с
|
Соберите прямой счет по обеим таблицам ошибок, соедините с
|
||||||
`dm.dq_errors_daily_v` полным внешним соединением по ключу и посчитай
|
`dm.dq_errors_daily_v` полным внешним соединением по ключу и посчитайте
|
||||||
строки, где ключа нет с одной из сторон или где расходится `error_rows`.
|
строки, где ключа нет с одной из сторон или где расходится `error_rows`.
|
||||||
Ноль — зеленый.
|
Ноль — зеленый.
|
||||||
|
|
||||||
|
|||||||
@@ -91,10 +91,10 @@
|
|||||||
|
|
||||||
## Как проверить себя
|
## Как проверить себя
|
||||||
|
|
||||||
Деловой ключ — `event_id` внутри дня. Собери прямой ответ из `dds.event_v`
|
Деловой ключ — `event_id` внутри дня. Соберите прямой ответ из
|
||||||
за тот же день, соедини с витриной полным внешним соединением и посчитай
|
`dds.event_v` за тот же день, соедините с витриной полным внешним
|
||||||
строки, где ключа нет с одной из сторон или где различаются значения
|
соединением и посчитайте строки, где ключа нет с одной из сторон или где
|
||||||
деловых колонок. Ноль — зеленый.
|
различаются значения деловых колонок. Ноль — зеленый.
|
||||||
|
|
||||||
Отдельно проверяются три производные колонки: `event_hour`, `page_path` и
|
Отдельно проверяются три производные колонки: `event_hour`, `page_path` и
|
||||||
`referer_host` должны совпасть с тем же выражением, посчитанным по
|
`referer_host` должны совпасть с тем же выражением, посчитанным по
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ DDS уже перевел код источника в слово. Словар
|
|||||||
|
|
||||||
С `visitors` история тоньше, и в ней главная ловушка задания. Складывать
|
С `visitors` история тоньше, и в ней главная ловушка задания. Складывать
|
||||||
уникальных по строкам нельзя: один и тот же посетитель, попавший в две
|
уникальных по строкам нельзя: один и тот же посетитель, попавший в две
|
||||||
строки, будет посчитан дважды. Проверь на стенде — и увидишь, что сумма
|
строки, будет посчитан дважды. Проверьте на стенде — и увидите, что сумма
|
||||||
`visitors` по устройствам за день **сходится** с `dm.daily_traffic_v`.
|
`visitors` по устройствам за день **сходится** с `dm.daily_traffic_v`.
|
||||||
|
|
||||||
Это не отменяет правила, а показывает, откуда берется совпадение: в мире
|
Это не отменяет правила, а показывает, откуда берется совпадение: в мире
|
||||||
@@ -87,17 +87,17 @@ DDS уже перевел код источника в слово. Словар
|
|||||||
|
|
||||||
## Ключ шардирования
|
## Ключ шардирования
|
||||||
|
|
||||||
Твое решение по [правилу донора](../architecture/storage.md), «Раскладка по
|
Ваше решение по [правилу донора](../architecture/storage.md), «Раскладка по
|
||||||
шардам». Здесь у измерения всего три встречающихся значения, и распределены
|
шардам». Здесь у измерения всего три встречающихся значения, и распределены
|
||||||
они неровно: планшеты — тонкая полоса, а телефоны и настольные машины держат
|
они неровно: планшеты — тонкая полоса, а телефоны и настольные машины держат
|
||||||
основную массу. Прежде чем брать хеш от одного `device_category`, посчитай,
|
основную массу. Прежде чем брать хеш от одного `device_category`, посчитайте,
|
||||||
сколько строк ляжет на каждый шард, и назови, чем тебя устраивает результат.
|
сколько строк ляжет на каждый шард, и назовите, чем вас устраивает результат.
|
||||||
|
|
||||||
## Как проверить себя
|
## Как проверить себя
|
||||||
|
|
||||||
Деловой ключ — `device_category` внутри дня. Собери прямой агрегат из
|
Деловой ключ — `device_category` внутри дня. Соберите прямой агрегат из
|
||||||
`dds.session_v` за день, соедини с `dm.session_overview_v` полным внешним
|
`dds.session_v` за день, соедините с `dm.session_overview_v` полным внешним
|
||||||
соединением и посчитай строки, где ключа нет с одной из сторон или где
|
соединением и посчитайте строки, где ключа нет с одной из сторон или где
|
||||||
расходится любой счетчик. Ноль — зеленый.
|
расходится любой счетчик. Ноль — зеленый.
|
||||||
|
|
||||||
Две проверки покрупнее ловят грубую ошибку сразу:
|
Две проверки покрупнее ловят грубую ошибку сразу:
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
# Свой график в Superset
|
||||||
|
|
||||||
|
**Чему учит:** увидеть, как собственный результат из хранилища становится
|
||||||
|
отчетом в BI.
|
||||||
|
|
||||||
|
## Сначала прочитать
|
||||||
|
|
||||||
|
- [«Немного Superset»](../handbook/superset.md);
|
||||||
|
- [задание 3: `dm.session_overview`](session-overview.md).
|
||||||
|
|
||||||
|
## Роль графика
|
||||||
|
|
||||||
|
В задании 3 вы собрали витрину `dm.session_overview_v`. Теперь покажите, с
|
||||||
|
каких устройств чаще уходят после первой страницы. Постройте столбиковый
|
||||||
|
график доли отказов по `device_category` за весь период витрины. Измерение
|
||||||
|
одно — `device_category`, метрика тоже одна.
|
||||||
|
|
||||||
|
## Что сделать
|
||||||
|
|
||||||
|
Заведите физический датасет в подключении к `ClickHouse`: схема `dm`, объект
|
||||||
|
`session_overview_v`. Назовите по-русски хотя бы две колонки:
|
||||||
|
|
||||||
|
- `device_category` — «Категория устройства»;
|
||||||
|
- `report_date` — «Дата отчета».
|
||||||
|
|
||||||
|
В редакторе датасета, на вкладке «Metrics», создайте метрику:
|
||||||
|
|
||||||
|
| Поле | Значение |
|
||||||
|
|---|---|
|
||||||
|
| `Metric Key` | `bounce_share` — ключ метрики и ее SQL-псевдоним |
|
||||||
|
| `Label` | «Доля отказов» |
|
||||||
|
| `SQL expression` | `SUM(bounce_sessions) / SUM(sessions)` |
|
||||||
|
| `D3 format` | `.1%` |
|
||||||
|
|
||||||
|
Доля считается из сумм слагаемых: среднее готовых долей соврет. Поэтому
|
||||||
|
метрике нужно это выражение. Сохраните ее в датасете, а не в графике:
|
||||||
|
подписи и формат задаются в датасете, а график их использует. Так во всех
|
||||||
|
будущих графиках у метрики будут одинаковые подписи. Это правило описано в
|
||||||
|
[справочнике Superset](../architecture/superset.md#дерево-импорта).
|
||||||
|
|
||||||
|
Не используйте вкладку «Custom SQL» конструктора графика. Созданная там
|
||||||
|
метрика доступна только этому графику, а нужна метрика датасета.
|
||||||
|
|
||||||
|
Создайте столбиковый график с метрикой «Доля отказов». В поле «X-axis»
|
||||||
|
укажите «Категория устройства», а «Dimensions» не заполняйте. Дашборд
|
||||||
|
создавать не нужно: сохраненного графика достаточно.
|
||||||
|
|
||||||
|
По умолчанию в графике выбран период «No filter». Оставьте его таким или
|
||||||
|
задайте явные даты. Относительный период, например «Last week», даст пустой
|
||||||
|
график: модельный календарь стенда отстает от настоящего. Последнюю дату
|
||||||
|
витрины посмотрите в SQL Lab:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT max(report_date)
|
||||||
|
FROM dm.session_overview_v;
|
||||||
|
```
|
||||||
|
|
||||||
|
Стендовые объекты не меняйте. Что переживает `make up`, а что стирает
|
||||||
|
`make clean`, описано в главе [«Немного Superset»](../handbook/superset.md#стендовые-объекты-и-ваши).
|
||||||
|
|
||||||
|
## Как проверить себя
|
||||||
|
|
||||||
|
График проверяется глазами, поэтому задачи для него в `homework_check` нет.
|
||||||
|
В SQL Lab выполните запрос:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT device_category,
|
||||||
|
round(100 * sum(bounce_sessions) / sum(sessions), 1) AS bounce_pct
|
||||||
|
FROM dm.session_overview_v
|
||||||
|
GROUP BY device_category
|
||||||
|
ORDER BY device_category;
|
||||||
|
```
|
||||||
|
|
||||||
|
Сверьте с графиком значение для каждой категории. В разделе «Customize»
|
||||||
|
включите «Show Value» или наведите указатель на столбик. Запрос возвращает
|
||||||
|
проценты с одним знаком, как формат `.1%`, поэтому числа должны совпасть
|
||||||
|
один в один.
|
||||||
|
|
||||||
|
## Приемка
|
||||||
|
|
||||||
|
- [ ] создан физический датасет `dm.session_overview_v` в подключении
|
||||||
|
`ClickHouse`;
|
||||||
|
- [ ] в датасете есть метрика «Доля отказов» с выражением
|
||||||
|
`SUM(bounce_sessions) / SUM(sessions)` и форматом `.1%`;
|
||||||
|
- [ ] для `device_category` и `report_date` заданы русские имена «Категория
|
||||||
|
устройства» и «Дата отчета»;
|
||||||
|
- [ ] сохранен столбиковый график доли отказов по категориям устройств без
|
||||||
|
относительного фильтра по времени;
|
||||||
|
- [ ] график сверен с запросом из SQL Lab;
|
||||||
|
- [ ] стендовые объекты не изменены, дашборд не создан.
|
||||||
@@ -1,39 +1,39 @@
|
|||||||
# Задание 6 (необязательное): свой дашборд в Superset
|
# Свой дашборд в Superset
|
||||||
|
|
||||||
**Чему учит:** довести свои витрины до потребителя — завести в Superset
|
**Чему учит:** довести свои витрины до потребителя — завести в Superset
|
||||||
датасеты поверх публичных представлений, подобрать графики под вопросы и
|
датасеты поверх публичных представлений, подобрать графики под вопросы и
|
||||||
собрать из них один связный экран.
|
собрать из них один связный экран.
|
||||||
|
|
||||||
Эта лаба идет после заданий 1–5 и опирается на их результат. Ее можно
|
Это факультатив раздела «Superset и BI». Его можно пройти после ступени 2,
|
||||||
пропустить: основной предмет стенда — ClickHouse, а здесь вся работа — в
|
когда готовы витрины ступени 1.
|
||||||
интерфейсе BI.
|
|
||||||
|
|
||||||
## Роль дашборда
|
## Роль дашборда
|
||||||
|
|
||||||
Собери обзор трафика и поведения посетителей. Он должен отвечать на три
|
Соберите обзор трафика и поведения посетителей. Он должен отвечать на три
|
||||||
вопроса: что происходило в магазине, какие страницы, устройства и рекламные
|
вопроса: что происходило в магазине, какие страницы, устройства и рекламные
|
||||||
каналы дали результат, были ли ошибки приема данных.
|
каналы дали результат, были ли ошибки приема данных.
|
||||||
|
|
||||||
Стендовый дашборд «Бизнес-сюжеты» собран из готовых витрин. Свой дашборд
|
Стендовый дашборд «Бизнес-сюжеты» собран из готовых витрин. Свой дашборд
|
||||||
собери из пяти витрин, которые ты построил в заданиях. Копировать раскладку
|
соберите из пяти витрин, которые вы построили в заданиях. Копировать раскладку
|
||||||
стендового дашборда не нужно: выбери форму, в которой ответы читаются без
|
стендового дашборда не нужно: выберите форму, в которой ответы читаются без
|
||||||
пояснений рядом с экраном.
|
пояснений рядом с экраном.
|
||||||
|
|
||||||
## Свои объекты — отдельно
|
## Свои объекты — отдельно
|
||||||
|
|
||||||
Не добавляй графики в стендовый дашборд и не правь его датасеты. При
|
Не добавляйте графики в стендовый дашборд и не правьте его датасеты. При
|
||||||
инициализации Superset импорт с `--overwrite` заменит ручные правки стендовых
|
инициализации Superset импорт с `--overwrite` заменит ручные правки стендовых
|
||||||
объектов файлами из репозитория. `make up` свой дашборд не стирает; срок жизни
|
объектов файлами из репозитория. `make up` свой дашборд не стирает; срок жизни
|
||||||
таких объектов описан в [доке Superset](../architecture/superset.md), «Импорт
|
таких объектов описан в [доке Superset](../architecture/superset.md), «Импорт
|
||||||
при каждой инициализации».
|
при каждой инициализации».
|
||||||
|
|
||||||
Заведи отдельные датасеты и графики, собери из них свой дашборд. Назови его,
|
Заведите отдельные датасеты и графики, соберите из них свой дашборд.
|
||||||
например, «Мои витрины DM». Это то же правило, по которому DDL домашек лежит
|
Назовите его, например, «Мои витрины DM». Это то же правило, по которому DDL
|
||||||
в `sql/ddl/70-labs.sql`: стенд привозит свои объекты, менти создает свои.
|
домашек лежит в `sql/ddl/70-labs.sql`: стендовые объекты уже есть, свои
|
||||||
|
создаете вы.
|
||||||
|
|
||||||
## Датасеты
|
## Датасеты
|
||||||
|
|
||||||
Заведи в подключении `ClickHouse` пять физических датасетов схемы `dm`:
|
Заведите в подключении `ClickHouse` пять физических датасетов схемы `dm`:
|
||||||
|
|
||||||
- `events_enriched_v`;
|
- `events_enriched_v`;
|
||||||
- `top_pages_daily_v`;
|
- `top_pages_daily_v`;
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
## Состав дашборда
|
## Состав дашборда
|
||||||
|
|
||||||
Каждая из пяти витрин должна появиться хотя бы в одном графике. Точный тип
|
Каждая из пяти витрин должна появиться хотя бы в одном графике. Точный тип
|
||||||
графика выбери сам. На дашборде покажи следующее:
|
графика выберите сами. На дашборде покажите следующее:
|
||||||
|
|
||||||
| Витрина | Что показать |
|
| Витрина | Что показать |
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
| `dq_errors_daily_v` | число ошибок по дню загрузки, источнику и классу |
|
| `dq_errors_daily_v` | число ошибок по дню загрузки, источнику и классу |
|
||||||
| `utm_effectiveness_v` | трафик, покупки и заявленную выручку по рекламным каналам |
|
| `utm_effectiveness_v` | трафик, покупки и заявленную выручку по рекламным каналам |
|
||||||
|
|
||||||
Для долей используй слагаемые из витрин. Например, доля отказов считается
|
Для долей используйте слагаемые из витрин. Например, доля отказов считается
|
||||||
как сумма `bounce_sessions`, деленная на сумму `sessions`. Среднее по готовым
|
как сумма `bounce_sessions`, деленная на сумму `sessions`. Среднее по готовым
|
||||||
долям для такого графика не подходит — урок задания 3 остается в силе.
|
долям для такого графика не подходит — урок задания 3 остается в силе.
|
||||||
|
|
||||||
@@ -65,19 +65,20 @@
|
|||||||
Эта лаба проверяется глазами. У расположения панелей и понятных подписей нет
|
Эта лаба проверяется глазами. У расположения панелей и понятных подписей нет
|
||||||
счетного инварианта, поэтому задачи для нее в `homework_check` нет.
|
счетного инварианта, поэтому задачи для нее в `homework_check` нет.
|
||||||
|
|
||||||
Открой список дашбордов и проверь:
|
Откройте список дашбордов и проверьте:
|
||||||
|
|
||||||
- «Бизнес-сюжеты» остался отдельным стендовым дашбордом;
|
- «Бизнес-сюжеты» остался отдельным стендовым дашбордом;
|
||||||
- твой дашборд открывается без ошибок и содержит график от каждого из пяти
|
- ваш дашборд открывается без ошибок и содержит график от каждого из пяти
|
||||||
датасетов;
|
датасетов;
|
||||||
- подписи, единицы измерения и легенды читаются без обращения к SQL;
|
- подписи, единицы измерения и легенды читаются без обращения к SQL;
|
||||||
- прямой трафик не исчез из графика UTM, а заявленная выручка не выдана за
|
- прямой трафик не исчез из графика UTM, а заявленная выручка не выдана за
|
||||||
серверную;
|
серверную;
|
||||||
- пустой график ошибок нормален, если в таблицах брака сейчас нет строк.
|
- пустой график ошибок нормален, если в таблицах брака сейчас нет строк.
|
||||||
|
|
||||||
Последний проход сделай как читатель: найди на экране самый заметный канал,
|
Последний проход сделайте как читатель: найдите на экране самый заметный
|
||||||
страницу и устройство, затем проверь, понятно ли из подписей, что именно
|
канал, страницу и устройство, затем проверьте, понятно ли из подписей, что
|
||||||
сравнивается. Если ответ приходится угадывать, поправь график или его название.
|
именно сравнивается. Если ответ приходится угадывать, поправьте график или
|
||||||
|
его название.
|
||||||
|
|
||||||
## Приемка
|
## Приемка
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
пересобирать нужно только то, что еще не собрано: хвост дней, которых в
|
пересобирать нужно только то, что еще не собрано: хвост дней, которых в
|
||||||
витрине нет, — от первого несобранного прожитого дня до последнего
|
витрине нет, — от первого несобранного прожитого дня до последнего
|
||||||
прожитого. Готовые дни трогать незачем, а вот дыру, оставленную частичным
|
прожитого. Готовые дни трогать незачем, а вот дыру, оставленную частичным
|
||||||
отказом, объем прогона обязан подобрать: ищи не последний собранный день, а
|
отказом, объем прогона обязан подобрать: ищите не последний собранный день, а
|
||||||
первый несобранный.
|
первый несобранный.
|
||||||
|
|
||||||
Механика — сборка отрезка в донор одной вставкой и замена дневных партиций
|
Механика — сборка отрезка в донор одной вставкой и замена дневных партиций
|
||||||
@@ -72,16 +72,16 @@
|
|||||||
|
|
||||||
## Ключ шардирования
|
## Ключ шардирования
|
||||||
|
|
||||||
Твое решение по [правилу донора](../architecture/storage.md), «Раскладка по
|
Ваше решение по [правилу донора](../architecture/storage.md), «Раскладка по
|
||||||
шардам». Подумай, чем эта витрина отличается от `revenue_daily`: там кроме
|
шардам». Подумайте, чем эта витрина отличается от `revenue_daily`: там кроме
|
||||||
дня было одно измерение из шести близких по объему значений, здесь —
|
дня было одно измерение из шести близких по объему значений, здесь —
|
||||||
страницы, которых много и которые по популярности очень неровные.
|
страницы, которых много и которые по популярности очень неровные.
|
||||||
|
|
||||||
## Как проверить себя
|
## Как проверить себя
|
||||||
|
|
||||||
Деловой ключ — `page_path` внутри дня. Собери прямой агрегат из
|
Деловой ключ — `page_path` внутри дня. Соберите прямой агрегат из
|
||||||
`dds.event_v` за день, соедини с `dm.top_pages_daily_v` полным внешним
|
`dds.event_v` за день, соедините с `dm.top_pages_daily_v` полным внешним
|
||||||
соединением по ключу и посчитай строки, где ключа нет с одной из сторон или
|
соединением по ключу и посчитайте строки, где ключа нет с одной из сторон или
|
||||||
где расходится любой из четырех счетчиков. Ноль — зеленый.
|
где расходится любой из четырех счетчиков. Ноль — зеленый.
|
||||||
|
|
||||||
Две проверки попроще, ими удобно ловить грубую ошибку до полного
|
Две проверки попроще, ими удобно ловить грубую ошибку до полного
|
||||||
@@ -94,7 +94,7 @@
|
|||||||
Проверки ловят разное. Фильтр `WHERE event_type = 'pageview'` первая из них
|
Проверки ловят разное. Фильтр `WHERE event_type = 'pageview'` первая из них
|
||||||
пропускает: отбор строк по типу не меняет счет событий того же типа.
|
пропускает: отбор строк по типу не меняет счет событий того же типа.
|
||||||
Расхождение покажет только вторая — вместе с `cart_adds` обнулятся и
|
Расхождение покажет только вторая — вместе с `cart_adds` обнулятся и
|
||||||
`purchases`. Проверку выбирают по тому, умеет ли она покраснеть на твоей
|
`purchases`. Проверку выбирают по тому, умеет ли она покраснеть на вашей
|
||||||
ошибке, а не по тому, как быстро она пишется: [проверка, которая не умеет
|
ошибке, а не по тому, как быстро она пишется: [проверка, которая не умеет
|
||||||
краснеть, бесполезна](../architecture/testing.md).
|
краснеть, бесполезна](../architecture/testing.md).
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
**Чему учит:** приставка `declared_` в имени колонки — предупреждение, а не
|
**Чему учит:** приставка `declared_` в имени колонки — предупреждение, а не
|
||||||
украшение. Она говорит: это заявка клиента, а не деньги отчетности. Урок
|
украшение. Она говорит: это заявка клиента, а не деньги отчетности. Урок
|
||||||
здесь дает конфликт: суммы не сойдутся, и раскапывать почему предстоит
|
здесь дает конфликт: суммы не сойдутся, и раскапывать почему предстоит
|
||||||
самому.
|
самостоятельно.
|
||||||
|
|
||||||
Правило стенда: **поведение и атрибуцию считаем по трекеру, деньги — по
|
Правило стенда: **поведение и атрибуцию считаем по трекеру, деньги — по
|
||||||
бэкенду**. Эта витрина — единственное разрешенное исключение: атрибуции по
|
бэкенду**. Эта витрина — единственное разрешенное исключение: атрибуции по
|
||||||
@@ -88,21 +88,21 @@ UTM у бэкенда нет, метки живут только в кликст
|
|||||||
|
|
||||||
## Ключ шардирования
|
## Ключ шардирования
|
||||||
|
|
||||||
Твое решение по [правилу донора](../architecture/storage.md), «Раскладка по
|
Ваше решение по [правилу донора](../architecture/storage.md), «Раскладка по
|
||||||
шардам». Зерно здесь составное, из трех колонок, и решение «взять хеш от
|
шардам». Зерно здесь составное, из трех колонок, и решение «взять хеш от
|
||||||
одной из них» надо защищать отдельно: назови, какая доля строк придется на
|
одной из них» надо защищать отдельно: назовите, какая доля строк придется на
|
||||||
самое частое значение выбранной колонки.
|
самое частое значение выбранной колонки.
|
||||||
|
|
||||||
## Конфликт, ради которого витрина и написана
|
## Конфликт, ради которого витрина и написана
|
||||||
|
|
||||||
Собери за один и тот же день две суммы: `sum(declared_revenue)` из своей
|
Соберите за один и тот же день две суммы: `sum(declared_revenue)` из своей
|
||||||
витрины и `sum(revenue)` из `dm.revenue_daily_v`. Они не сойдутся, и это
|
витрины и `sum(revenue)` из `dm.revenue_daily_v`. Они не сойдутся, и это
|
||||||
верное поведение обеих витрин.
|
верное поведение обеих витрин.
|
||||||
|
|
||||||
Базы у двух сумм при этом сравнимые: `revenue_daily` складывает цену позиций
|
Базы у двух сумм при этом сравнимые: `revenue_daily` складывает цену позиций
|
||||||
на количество и ни скидки, ни доставки в себя не берет — ровно то, что видит
|
на количество и ни скидки, ни доставки в себя не берет — ровно то, что видит
|
||||||
клиент. Значит все расхождение до копейки объясняется тем, что случилось с
|
клиент. Значит все расхождение до копейки объясняется тем, что случилось с
|
||||||
заказом, а не тем, как считали деньги. Ищи ответы среди таких причин:
|
заказом, а не тем, как считали деньги. Ищите ответы среди таких причин:
|
||||||
|
|
||||||
- отмененный заказ из кликстрима никуда не девается: событие покупки
|
- отмененный заказ из кликстрима никуда не девается: событие покупки
|
||||||
случилось, а `revenue_daily` считает только оплаченные;
|
случилось, а `revenue_daily` считает только оплаченные;
|
||||||
@@ -113,7 +113,7 @@ UTM у бэкенда нет, метки живут только в кликст
|
|||||||
|
|
||||||
Как эти же расхождения выглядят на зерне заказа, показывает стендовая
|
Как эти же расхождения выглядят на зерне заказа, показывает стендовая
|
||||||
витрина `dm.purchase_vs_orders_v` с ее классами расхождений: это готовый
|
витрина `dm.purchase_vs_orders_v` с ее классами расхождений: это готовый
|
||||||
ответ на вопрос «а сколько именно и из-за чего». Запиши свой вывод —
|
ответ на вопрос «а сколько именно и из-за чего». Запишите свой вывод —
|
||||||
в двух-трех фразах, своими словами.
|
в двух-трех фразах, своими словами.
|
||||||
|
|
||||||
Проверять сходимость этих двух сумм не нужно и нельзя: они и не должны
|
Проверять сходимость этих двух сумм не нужно и нельзя: они и не должны
|
||||||
@@ -122,8 +122,8 @@ UTM у бэкенда нет, метки живут только в кликст
|
|||||||
## Как проверить себя
|
## Как проверить себя
|
||||||
|
|
||||||
Деловой ключ — тройка `utm_source`, `utm_medium`, `utm_campaign` внутри
|
Деловой ключ — тройка `utm_source`, `utm_medium`, `utm_campaign` внутри
|
||||||
дня. Собери прямой агрегат из `dds.event_v` за день, соедини с
|
дня. Соберите прямой агрегат из `dds.event_v` за день, соедините с
|
||||||
`dm.utm_effectiveness_v` полным внешним соединением и посчитай строки, где
|
`dm.utm_effectiveness_v` полным внешним соединением и посчитайте строки, где
|
||||||
ключа нет с одной из сторон или где расходится любая из пяти величин. Ноль —
|
ключа нет с одной из сторон или где расходится любая из пяти величин. Ноль —
|
||||||
зеленый.
|
зеленый.
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user