# Задание 1: события для анализа, `dm.events_enriched_v` Вы подготовите представление с полями для анализа событий. Оно будет добавлять вычисляемые поля при чтении, сохраняя одну строку на событие. ## Подготовка - [«Хранилище и его слои»](../handbook/storage-layers.md). - [Выполнение SQL в DBeaver](README.md#выполнение-sql-в-dbeaver): файл для решения и подключение с правами на создание витрины. ## Данные для анализа событий В `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`. У события с тремя позициями получится три строки вместо одной. Главная опасность — потеря событий с пустым массивом товаров: `ARRAY JOIN` исключает их из результата. Товары есть только в событиях корзины и покупки. Поэтому исчезнет большинство событий — девятнадцать строк из двадцати. Запрос выполнится без ошибки, а витрина по имени и составу колонок по-прежнему будет выглядеть таблицей событий. Сохраните массивы как в источнике. Для анализа отдельных товарных позиций нужна отдельная витрина, где одна строка соответствует товарной позиции. ## Проверка результата После применения DDL откройте Airflow по [адресу из README](../../README.md#адреса-и-пароли), найдите даг `homework_check` и запустите его вручную. В новом запуске откройте задачу `events_enriched`: она должна завершиться успешно. Если задача красная, откройте ее журнал (`Logs`) — там будет причина ошибки, а при расхождениях с источником — дни и примеры несовпадений. Задачи еще не созданных витрин будут красными; это ожидаемо и не мешает проверке первой. Выберите день и прочитайте его события из `dds.event_v` и своей витрины. Сопоставьте строки по `event_id` через `FULL OUTER JOIN`. Найдите события, которые есть только с одной стороны, и события, у которых различаются перенесенные из источника поля. Расхождений должно быть ноль. Отдельно сверьте `event_hour`, `page_path` и `referer_host` с теми же выражениями, рассчитанными прямо по `dds.event_v`. ## Результат работы - [ ] у вас есть `dm.events_enriched_v` с явно перечисленными колонками; - [ ] вы сверили число строк и набор `event_id` с `dds.event_v` за каждый прожитый день; расхождений нет; - [ ] проверка `events_enriched` в `homework_check` прошла успешно; - [ ] витрина работает без физической таблицы и задачи в `dm_transform`.