docs(labs): файлы ТЗ переименованы по схеме S-N-slug
- Зачем:
- в docs/labs/ будет много заданий; номер ступени и номер задания в имени
делают папку оглавлением программы и избавляют от поиска по README (#230).
- Что:
- шесть ТЗ переименованы через git mv: 1-1…1-5 для ступени 1,
2-1-superset-chart.md для ступени 2; факультатив superset-dashboard.md
остался без номера.
- обновлены ссылки в docs/labs/README.md, 2-1-superset-chart.md,
docs/architecture/dds/session.md и пути в dags/homework_check.py.
- правило имен для docs/labs/ в AGENTS.md переписано под S-N-slug.
- Проверка:
- make lint; скрипт обхода относительных ссылок в docs/ и AGENTS.md —
битых нет.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
8b9258ed41
commit
d955f7d694
10 files changed
+21
-17
No files matched your search
@@ -0,0 +1,93 @@
|
||||
# Задание 1: `dm.events_enriched_v`
|
||||
|
||||
**Чему учит:** строить слой как договор о данных, а не как их копию.
|
||||
Оставлять витрину представлением, если зерно источника не меняется.
|
||||
|
||||
## Сначала прочитать
|
||||
|
||||
- [«Хранилище и его слои»](../handbook/storage-layers.md).
|
||||
|
||||
## Роль витрины
|
||||
|
||||
В `dds.event_v` 44 колонки, включая технические поля источника и массивы
|
||||
товаров. Для анализа событий в Superset нужны деловые поля и три готовых
|
||||
значения: час события, путь страницы и домен перехода. Тогда вам не придется
|
||||
повторять эти выражения в каждом запросе.
|
||||
|
||||
Витрины следующих заданий читают DDS напрямую. Использовать
|
||||
`dm.events_enriched_v` как источник для них не нужно: задания независимы, их
|
||||
можно выполнять в любом порядке.
|
||||
|
||||
## Что сделать
|
||||
|
||||
Создайте обычное представление `CREATE VIEW dm.events_enriched_v`.
|
||||
Единственный источник — `dds.event_v`. Зерно — **событие**: каждой строке
|
||||
источника соответствует одна строка витрины.
|
||||
|
||||
Физическая таблица, таблица-донор и задача в `dm_transform` не нужны.
|
||||
Представление не хранит строки, поэтому ключ шардирования и пересборка ему
|
||||
не требуются.
|
||||
|
||||
Укажите колонки явно. Иначе новая колонка источника попадет в витрину
|
||||
автоматически, и договор с потребителем изменится без вашего участия.
|
||||
|
||||
| Группа | Колонки |
|
||||
|---|---|
|
||||
| Время и посетитель | `event_date`, `event_time`, `event_hour`, `client_id`, `event_id` |
|
||||
| Действие | `event_type` (`pageview`, `add_to_cart`, `purchase`), `url`, `page_path`, `referer`, `referer_host`, `title` |
|
||||
| UTM-метки | `utm_source`, `utm_medium`, `utm_campaign`, `utm_content`, `utm_term` |
|
||||
| Устройство и регион | `device_category`, `browser`, `operating_system`, `region_country`, `region_city` |
|
||||
| Товары и покупка | `product_id`, `product_name`, `product_category`, `product_price`, `product_quantity`, `product_event_type`, `purchase_id`, `purchase_revenue`, `purchase_coupon` |
|
||||
|
||||
Три колонки вычислите в представлении. Остальные возьмите из источника без
|
||||
изменений, сохранив массивы `product_*`.
|
||||
|
||||
| Колонка | Как считается | Для чего нужна |
|
||||
|---|---|---|
|
||||
| `event_hour` | `toHour(event_time)` | Анализ событий по часам суток |
|
||||
| `page_path` | путь `url` без домена и параметров | Группировка по странице |
|
||||
| `referer_host` | домен `referer` | Анализ источников перехода |
|
||||
|
||||
Не добавляйте `_load_id` и `_load_ts`. Их нет и у `dds.event_v`: события в
|
||||
DDS читают из ODS без отдельной загрузки. Эти служебные поля указывают на
|
||||
запуск, который записал строку на диск. Представление ничего не загружает.
|
||||
|
||||
## Типичная ошибка
|
||||
|
||||
Не разворачивайте массивы товаров через `ARRAY JOIN`. У события с тремя
|
||||
позициями получится три строки. Зерно изменится. Витрину с новым зерном на
|
||||
стенде хранят готовым агрегатом — причины описаны в разделе [«Как принято на
|
||||
ступени 1»](README.md#как-принято-на-ступени-1).
|
||||
|
||||
Главная опасность — потеря событий с пустым массивом товаров: `ARRAY JOIN`
|
||||
исключает их из результата. Товары есть только в событиях корзины и покупки.
|
||||
Поэтому исчезнет большинство событий — девятнадцать строк из двадцати.
|
||||
Запрос выполнится без ошибки, а витрина по имени и составу колонок
|
||||
по-прежнему будет выглядеть таблицей событий.
|
||||
|
||||
Сохраните массивы как в источнике. Для анализа отдельных товарных позиций
|
||||
нужна другая витрина с другим зерном и именем.
|
||||
|
||||
## Как проверить себя
|
||||
|
||||
Деловой ключ — `event_id` внутри дня. Получите результат прямо из
|
||||
`dds.event_v` за тот же день. Соедините его с витриной полным внешним
|
||||
соединением по `event_id`. Посчитайте строки, где ключ отсутствует с одной
|
||||
из сторон или различаются значения деловых колонок. Расхождений должно быть
|
||||
ноль.
|
||||
|
||||
Отдельно сверьте `event_hour`, `page_path` и `referer_host` с теми же
|
||||
выражениями, рассчитанными прямо по `dds.event_v`.
|
||||
|
||||
Если строк в витрине в разы меньше, чем в источнике, и остались только
|
||||
события корзины и покупки, это признак развернутых массивов: `ARRAY JOIN`
|
||||
исключил все события с пустым массивом товаров.
|
||||
|
||||
## Приемка
|
||||
|
||||
- [ ] представление `dm.events_enriched_v` создано без физических таблиц;
|
||||
- [ ] список колонок в представлении задан явно;
|
||||
- [ ] число строк и набор `event_id` совпадают с `dds.event_v` за каждый
|
||||
прожитый день;
|
||||
- [ ] задача `events_enriched` в `homework_check` завершилась успешно;
|
||||
- [ ] задачи для этой витрины в `dm_transform` нет.
|
||||
Reference in new issue
Block a user