title: Карта слоев хранилища lead: Проследите путь событий и заказов от Kafka до отчетов. chapter_url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/handbook/storage-layers.md#user-content-хранилище-и-его-слои intro: - Выберите объект, чтобы узнать, что он хранит, как его читать и откуда в него поступают данные. - Выберите стрелку, чтобы посмотреть способ обработки и открыть SQL-запрос. - Для выбранного объекта подсвечиваются все пути, по которым данные поступают в него и используются дальше. - Кнопки «События» и «Заказы» выделяют нужный поток. Остальные объекты остаются на месте, но становятся бледнее. - Если вы впервые знакомитесь со слоями хранилища, начните с главы по ссылке ниже. streams: all: Все events: События orders: Заказы dictionary: title: Словарь caption: справочные данные layers: - id: kafka title: Kafka caption: сообщения источников - id: stg title: STG caption: исходные сообщения - id: ods title: ODS caption: данные разобраны по полям - id: dds title: DDS caption: события, заказы и сессии - id: dm title: DM caption: витрины для отчетов mechanisms: - id: materialized_view label: материализованное представление line: solid rhythm: непрерывно, по мере прихода сообщений - id: airflow_dag label: даг Airflow line: dashed rhythm: 'пакетно: раз в модельные сутки (`orders_ingest`) или при каждом запуске конвейера' - id: view label: представление line: dotted rhythm: при запросе к представлению, без копирования данных nodes: - id: kafka_hits name: hits layer: kafka order: 0 streams: [events] what: Топик Kafka с событиями кликстрима. Каждое сообщение содержит одно событие. read: "Для просмотра загруженных сообщений используйте `stg.hits_raw_dist`. Таблица `stg.hits_raw_kafka` служит для приема из топика." fill: - "Генератор отправляет события без пауз в пакетном режиме или постепенно в живом режиме." links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/storage.md#user-content-при%D1%91м-поток-и-его-свойства - label: Формат url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/formats/clickstream-event.md#user-content-описание-выгрузки-событие-кликстрима - id: kafka_orders name: orders layer: kafka order: 1 streams: [orders] what: "Топик Kafka с дневными выгрузками заказов — слепками. Каждый слепок содержит состояние заказов за последние семь модельных дней." read: "Для просмотра загруженных сообщений используйте `stg.orders_raw_dist`. Таблица `stg.orders_raw_kafka` служит для приема из топика." fill: - "После генерации событий дня D источник отправляет слепок заказов за предыдущий день D−1." links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/orders/ingestion.md#user-content-поток-данных - label: Устройство слепка url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/orders/snapshot.md#user-content-слепок-и-его-доставка - id: stg_hits name: stg.hits_raw_dist layer: stg order: 0 streams: [events] what: "Исходное сообщение события и сведения о его доставке из Kafka. Содержимое сохраняется целой строкой, без разбора на поля." read: 'Читайте `_dist`: у STG нет представления `_v`, а распределенная таблица показывает оба шарда.' parts: - "`stg.hits_raw_kafka` — таблица для чтения сообщений топика `hits`." - "`stg.hits_raw_rep` — реплицируемая таблица на шарде." - "`stg.hits_raw_dist` — распределенная таблица для записи и чтения." - "`stg.hits_raw_mv` — материализованное представление, которое записывает сообщения из Kafka в STG." fill: - '`stg.hits_raw_mv` пишет непрерывно, по мере прихода сообщений.' - Строки хранятся не менее трех суток от загрузки. Удаление целыми частями таблицы добавляет до суток к этому сроку; оно выполняется при очередном слиянии по TTL. links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/storage.md#user-content-при%D1%91м-поток-и-его-свойства - label: DDL таблиц url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/10-stg-tables.sql - label: DDL материализованного представления url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/40-stg-views.sql - id: stg_orders name: stg.orders_raw_dist layer: stg order: 1 streams: [orders] what: "Исходные строки выгрузки заказов, сведения о доставке и идентификатор загруженной партии `_load_id`." read: 'Читайте `_dist`: у STG нет представления `_v`, а распределенная таблица показывает оба шарда.' parts: - "`stg.orders_raw_kafka` — таблица для чтения топика `orders` на первом узле." - "`stg.orders_raw_rep` — реплицируемая таблица на шарде." - "`stg.orders_raw_dist` — распределенная таблица для записи и чтения." fill: - Задача `pull_batch` дага `orders_ingest` загружает слепок раз в модельные сутки. - Строки хранятся не менее трех суток от загрузки. Удаление целыми частями таблицы добавляет до суток к этому сроку; оно выполняется при очередном слиянии по TTL. links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/orders/ingestion.md#user-content-поток-данных - label: DDL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/10-stg-tables.sql - id: ods_event name: ods.event_v layer: ods order: 0 streams: [events] what: "События, разобранные на колонки с типами данных. Имена полей сохранены как в источнике." read: "Читайте `ods.event_v`: представление использует `FINAL` и возвращает последнюю версию каждого события." parts: - '`ods.event_rep` — реплицируемая таблица версий события на шарде.' - '`ods.event_dist` — распределенная таблица записи и диагностики.' - '`ods.event_v` — представление актуального состояния с `FINAL`.' - '`ods.event_mv` — материализованное представление для разбора сообщений STG без ошибок.' keys: - '`WatchID` — тот же идентификатор, что `event_id` в DDS.' - '`ClientID` — тот же посетитель, что `client_id` в DDS.' - '`EventDate` — тот же день, что `event_date` в DDS.' fill: - '`ods.event_mv` разбирает строки непрерывно, по мере записи в STG.' - '`ReplacingMergeTree(_load_ts)` хранит версии, а `FINAL` выбирает актуальную.' links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/storage.md#user-content-актуальные-события - label: DDL таблиц url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/20-ods-tables.sql - label: DDL представлений url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/30-ods-views.sql - id: ods_event_errors name: ods.event_errors_dist layer: ods order: 1 streams: [events] what: "Сообщения событий, которые не удалось разобрать по правилам ODS. Сохранены исходная строка, класс ошибки и сведения о доставке." read: 'Читайте `_dist`: представления `_v` нет, а распределенная таблица показывает ошибки с обоих шардов.' parts: - '`ods.event_errors_rep` — реплицируемая таблица ошибок на шарде.' - '`ods.event_errors_dist` — распределенная таблица чтения и записи.' - '`ods.event_errors_mv` — материализованное представление для отбора сообщений STG с ошибками.' fill: - '`ods.event_errors_mv` пишет непрерывно, по мере записи в STG.' - Ошибки хранятся один месяц. Остальные события продолжают загружаться. links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/storage.md#user-content-таблица-ошибок - label: DDL таблиц url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/20-ods-tables.sql - label: DDL материализованного представления url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/30-ods-views.sql - id: ods_order name: ods.order_v layer: ods order: 2 streams: [orders] what: "Последняя загруженная версия заказа с именами полей из источника. Состав заказа пока хранится как фрагмент JSON." read: 'Читайте `ods.order_v`: запрос представления с `FINAL` возвращает последнюю версию по `snapshot_date`.' parts: - '`ods.order_rep` — реплицируемая таблица версий заказа на шарде.' - '`ods.order_dist` — распределенная таблица записи и диагностики.' - '`ods.order_v` — представление текущего состояния с `FINAL`.' keys: - '`order_id` — тот же заказ в `dds.order_v` и `dm.purchase_vs_orders_v`.' - '`user_id` — пользователь магазина, который переходит в заказ DDS.' fill: - Задача `parse_batch` дага `orders_ingest` разбирает загруженный слепок раз в модельные сутки. - '`ReplacingMergeTree(snapshot_date)` оставляет версию из последнего принятого слепка.' links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/storage.md#user-content-версии-заказов - label: DDL таблиц url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/20-ods-tables.sql - label: DDL представления url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/30-ods-views.sql - id: ods_order_errors name: ods.order_errors_dist layer: ods order: 3 streams: [orders] what: "Строки выгрузки заказов, которые не удалось разобрать по правилам ODS. Сохранены исходная строка, класс ошибки и `_load_id`." read: 'Читайте `_dist`: представления `_v` нет, а распределенная таблица показывает ошибки с обоих шардов.' parts: - '`ods.order_errors_rep` — реплицируемая таблица ошибок на шарде.' - '`ods.order_errors_dist` — распределенная таблица чтения и записи.' fill: - Задача `parse_batch` дага `orders_ingest` сохраняет строки с ошибками при разборе той же выгрузки, из которой загружаются заказы. - Ошибки хранятся один месяц. Остальные заказы продолжают загружаться. links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/storage.md#user-content-таблица-ошибок - label: DDL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/20-ods-tables.sql - id: dds_event name: dds.event_v layer: dds order: 0 streams: [events] what: "События с названиями полей, принятыми в DDS. Например, `WatchID` переименован в `event_id`, а числовой код устройства заменен названием категории." read: "Читайте `dds.event_v`: представление возвращает явно перечисленные колонки DDS." parts: - '`dds.event_v` — только представление над `ods.event_v`; своей таблицы в DDS нет.' keys: - '`event_id` — тот же идентификатор, что `WatchID` в ODS.' - '`client_id` — тот же посетитель, что `ClientID` в ODS; соединяет событие с сессией и картой идентичностей.' - '`event_date` — тот же день, что `EventDate` в ODS.' - '`purchase_id[1]` — тот же заказ, что `order_id` в DDS и DM.' fill: - "При запросе к `dds.event_v` данные читаются из актуальных событий ODS. Отдельная загрузка в DDS не нужна." links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dds/event.md#user-content-форма - label: DDL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/50-dds-views.sql - id: dds_session name: dds.session_v layer: dds order: 1 streams: [events] what: "Сессии, рассчитанные дагом `dds_transform` по событиям посетителя. Новая сессия начинается после паузы дольше 30 минут или при смене модельной даты." read: "Читайте `dds.session_v`: здесь есть начало, конец, длительность сессии, показатели событий и служебные поля загрузки." parts: - '`dds.session_rep` — реплицируемая таблица сессий на шарде.' - '`dds.session_dist` — распределенная таблица загрузки и диагностики.' - '`dds.session_stage_rep` — промежуточная таблица для пересчета данных по дням на шарде.' - '`dds.session_stage_dist` — распределенная таблица для записи и чтения промежуточных данных.' - '`dds.session_v` — представление для чтения готовых данных.' keys: - '`client_id` — тот же посетитель, что в событии DDS и карте идентичностей.' - '`session_date` — день, который в `dm.daily_traffic_v` называется `report_date`.' fill: - "При каждом запуске `dds_transform` выбирает дни от первого пропущенного в DDS до последнего дня с завершенной генерацией." - "Задача `session.rebuild` рассчитывает данные в промежуточной таблице (доноре). `session.replace` заменяет ими дневные партиции основной таблицы." links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dds/session.md#user-content-движок-и-наполнение - label: DDL таблиц url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/45-dds-tables.sql - label: DDL представления url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/50-dds-views.sql - id: dds_order name: dds.order_v layer: dds order: 2 streams: [orders] what: "Последнее известное состояние заказа, подготовленное для анализа. Артикулы, количества и цены товаров хранятся в массивах; элементы с одинаковым индексом относятся к одной позиции заказа." read: "Читайте `dds.order_v`, чтобы получить готовые заказы из основной таблицы." parts: - '`dds.order_rep` — реплицируемая таблица заказов на шарде.' - '`dds.order_dist` — распределенная таблица загрузки и диагностики.' - '`dds.order_stage_rep` — промежуточная таблица для пересчета данных по дням на шарде.' - '`dds.order_stage_dist` — распределенная таблица для записи и чтения промежуточных данных.' - '`dds.order_v` — представление для чтения готовых данных.' keys: - '`order_id` — тот же заказ, что в ODS, событии покупки и витрине сверки.' - '`user_id` — пользователь магазина, который входит в карту идентичностей.' - '`item_sku` — тот же артикул, что `sku` в `dic.products`.' - '`order_date` — день, который в витринах называется `report_date` или `order_day`.' fill: - "При каждом запуске `dds_transform` пересчитывает дни заказов из последнего слепка и заполняет пропуски в DDS." - "Задача `order.rebuild` рассчитывает данные в промежуточной таблице (доноре). `order.replace` заменяет ими дневные партиции основной таблицы." links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dds/order.md#user-content-движок-и-наполнение - label: DDL таблиц url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/45-dds-tables.sql - label: DDL представления url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/50-dds-views.sql - id: dds_identity name: dds.identity_map_v layer: dds order: 3 streams: [events, orders] what: "Связи между посетителем сайта и пользователем магазина. Они появляются, когда событие покупки сопоставлено с заказом по его номеру." read: "Читайте `dds.identity_map_v`: представление с `FINAL` возвращает последнюю версию каждой пары посетителя и пользователя." parts: - '`dds.identity_map_rep` — реплицируемая таблица версий пар на шарде.' - '`dds.identity_map_dist` — распределенная таблица записи.' - '`dds.identity_map_v` — представление последних версий строк с `FINAL`.' keys: - "`client_id` — идентификатор посетителя из cookie браузера, как в событии и сессии DDS." - "`user_id` — пользователь магазина из заказа DDS." fill: - "Задача `identity_map` дага `dds_transform` пересчитывает все известные пары после обновления заказов." - "При каждом запуске записывается новая версия набора связей." links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dds/identity.md#user-content-сборка - label: DDL таблиц url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/45-dds-tables.sql - label: DDL представления url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/50-dds-views.sql - id: dm_daily_traffic name: dm.daily_traffic_v layer: dm order: 0 streams: [events] what: "Число посетителей и известных пользователей за каждый день. Известными считаются пользователи магазина, связанные с посетителями сайта через карту идентичностей." read: "Читайте `dm.daily_traffic_v`: представление с `FINAL` возвращает последний результат расчета за каждый день." parts: - '`dm.daily_traffic_rep` — реплицируемая таблица версий счетчиков.' - '`dm.daily_traffic_dist` — распределенная таблица записи.' - '`dm.daily_traffic_v` — представление последних версий строк с `FINAL`.' keys: - '`report_date` — тот же день, что `session_date` в сессии DDS.' fill: - "Задача `daily_traffic` дага `dm_transform` при каждом запуске пересчитывает всю историю и записывает новую версию." links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dm.md#user-content-dmdaily_traffic_v - label: DDL таблиц url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/55-dm-tables.sql - label: DDL представления url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/60-dm-views.sql - id: dm_revenue name: dm.revenue_daily_v layer: dm order: 1 streams: [orders] what: "Выручка, число заказов и единиц товара за день по категориям. В расчет входят оплаченные заказы." read: "Читайте `dm.revenue_daily_v`, чтобы получить готовые показатели по дням и категориям товаров." parts: - '`dm.revenue_daily_rep` — реплицируемая таблица витрины на шарде.' - '`dm.revenue_daily_dist` — распределенная таблица загрузки.' - '`dm.revenue_daily_stage_rep` — промежуточная таблица для пересчета данных по дням на шарде.' - '`dm.revenue_daily_stage_dist` — распределенная таблица для записи и чтения промежуточных данных.' - '`dm.revenue_daily_v` — представление для чтения готовых данных.' keys: - '`report_date` — тот же день, что `order_date` в заказе DDS.' - '`product_category` — категория, найденная по `item_sku` заказа и ключу `sku` словаря.' fill: - "При каждом запуске `dm_transform` пересчитывает дни заказов из последнего слепка и заполняет пропущенные дни витрины." - "Задача `revenue_daily.rebuild` рассчитывает данные в промежуточной таблице (доноре). `revenue_daily.replace` заменяет ими дневные партиции витрины." links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dm.md#user-content-dmrevenue_daily_v - label: DDL таблиц url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/55-dm-tables.sql - label: DDL представления url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/60-dm-views.sql - id: dm_purchase name: dm.purchase_vs_orders_v layer: dm order: 2 streams: [events, orders] what: "Результат сверки покупок из кликстрима с заказами магазина. Для каждого номера заказа указано, совпали ли данные двух источников и какое расхождение найдено." read: "Читайте `dm.purchase_vs_orders_v`: если покупка или заказ отсутствует, поля этой стороны содержат `NULL`." parts: - '`dm.purchase_vs_orders_rep` — реплицируемая таблица сверки на шарде.' - '`dm.purchase_vs_orders_dist` — распределенная таблица загрузки.' - '`dm.purchase_vs_orders_stage_rep` — промежуточная таблица для пересчета данных по дням на шарде.' - '`dm.purchase_vs_orders_stage_dist` — распределенная таблица для записи и чтения промежуточных данных.' - '`dm.purchase_vs_orders_v` — представление для чтения готовых данных.' keys: - "`order_id` — тот же заказ, что `purchase_id[1]` в событии и `order_id` в заказе DDS." - "`order_day` — дата заказа; если заказа еще нет, берется дата события покупки." fill: - "При каждом запуске `dm_transform` пересчитывает дни последнего слепка, добавляет новые дни покупок, заполняет пропуски и повторяет сверку дней с покупками без заказа." - "Задача `purchase_vs_orders.rebuild` рассчитывает данные в промежуточной таблице (доноре). `purchase_vs_orders.replace` заменяет ими дневные партиции витрины." links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dm.md#user-content-dmpurchase_vs_orders_v - label: DDL таблиц url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/55-dm-tables.sql - label: DDL представления url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/60-dm-views.sql - id: dm_dq name: dm.dq_summary_v layer: dm order: 3 streams: [events, orders] what: "Последние результаты пяти проверок качества данных за каждый день. Историю запусков можно посмотреть в Airflow." read: "Читайте `dm.dq_summary_v`, чтобы увидеть результат каждой проверки за день." parts: - '`dm.dq_summary_rep` — реплицируемая таблица опубликованной сводки.' - '`dm.dq_summary_dist` — распределенная таблица чтения и записи.' - '`dm.dq_summary_stage_rep` — промежуточная таблица для результатов всех проверок за день.' - '`dm.dq_summary_stage_dist` — распределенная таблица для записи и чтения промежуточных данных.' - '`dm.dq_summary_v` — представление для чтения готовых данных.' fill: - Даг `dq_check` сначала рассчитывает результаты всех пяти проверок в промежуточной таблице, затем заменяет ими дневные партиции сводки. - '`sessions_vs_reference` — `sql/dq/sessions_vs_reference.sql`.' - '`classes_vs_inventory` — `sql/dq/classes_vs_inventory.sql` и эталонные числа из паспорта мира `data/world-inventory.json`.' - '`revenue_daily_vs_dds` — `sql/dq/revenue_daily_vs_dds.sql`.' - '`purchase_vs_orders_vs_dds` — `sql/dq/purchase_vs_orders_vs_dds.sql`.' - '`daily_traffic_vs_dds` — `sql/dq/daily_traffic_vs_dds.sql`.' links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dm.md#user-content-dmdq_summary - label: DDL таблиц url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/55-dm-tables.sql - label: DDL представления url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/60-dm-views.sql - id: dic_products name: dic.products layer: dic order: 0 streams: [orders] what: "Словарь товаров. По артикулу можно получить название, бренд, категорию и цену. Эти данные доступны для расчетов в разных слоях." read: "Читайте `dic.products`: к словарю обращаются напрямую, суффикса `_v` у него нет." parts: - "`dic.products_file` — таблица, которая читает каталог товаров из CSV-файла репозитория." - "`dic.products` — словарь в памяти, загруженный из этой таблицы." keys: - '`sku` — тот же артикул, что `item_sku` в позиции заказа DDS.' fill: - "ClickHouse обновляет словарь из `dic.products_file` каждые 60–90 секунд согласно настройке `LIFETIME`." links: - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/storage.md#user-content-справочники - label: DDL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/05-dic-catalog.sql edges: - id: hits_to_stg from: kafka_hits to: stg_hits mechanism: materialized_view streams: [events] rhythm: непрерывно, по мере прихода сообщений actor: "Таблица `stg.hits_raw_kafka` и материализованное представление `stg.hits_raw_mv`." join: "Каждое сообщение Kafka записывается целой строкой, без разбора на поля." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/40-stg-views.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/storage.md#user-content-при%D1%91м-поток-и-его-свойства - id: stg_to_event from: stg_hits to: ods_event mechanism: materialized_view streams: [events] rhythm: непрерывно, по мере прихода сообщений actor: Материализованное представление `ods.event_mv` разбирает сообщения без ошибок. join: "Материализованное представление разбирает сообщение из STG на колонки с нужными типами данных." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/30-ods-views.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/storage.md#user-content-при%D1%91м-поток-и-его-свойства - id: stg_to_event_errors from: stg_hits to: ods_event_errors mechanism: materialized_view streams: [events] rhythm: непрерывно, по мере прихода сообщений actor: "Материализованное представление `ods.event_errors_mv` отбирает сообщения с ошибками." join: "Сообщение, которое не удалось разобрать по правилам ODS, сохраняется целиком вместе с классом ошибки." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/30-ods-views.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/storage.md#user-content-таблица-ошибок - id: orders_to_stg from: kafka_orders to: stg_orders mechanism: airflow_dag streams: [orders] rhythm: одной выгрузкой, раз в модельные сутки actor: Задача `pull_batch` дага `orders_ingest` читает `stg.orders_raw_kafka`. join: "Строки выгрузки сохраняются целиком. Общий `_load_id` позволяет найти все строки одной загрузки." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/stg/orders_raw_load.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/orders/ingestion.md#user-content-одно-чтение-kafka - id: stg_to_order from: stg_orders to: ods_order mechanism: airflow_dag streams: [orders] rhythm: одной выгрузкой, раз в модельные сутки actor: Задача `parse_batch` дага `orders_ingest` записывает версии заказов без ошибок разбора. join: "Строка разбирается на колонки заказа. Версия определяется датой слепка `snapshot_date`." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ods/order_parse.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/orders/ingestion.md#user-content-граница-строгого-при%D1%91ма - id: stg_to_order_errors from: stg_orders to: ods_order_errors mechanism: airflow_dag streams: [orders] rhythm: одной выгрузкой, раз в модельные сутки actor: Задача `parse_batch` дага `orders_ingest` записывает строки с ошибками из загруженной выгрузки. join: "Строка с ошибкой сохраняется целиком вместе с классом ошибки и идентификатором загрузки." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ods/order_parse.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/orders/ingestion.md#user-content-граница-строгого-при%D1%91ма - id: ods_to_dds_event from: ods_event to: dds_event mechanism: view streams: [events] rhythm: при запросе к представлению, без копирования данных actor: "Представление `dds.event_v` читает данные из `ods.event_v`." join: "Колонки события переименовываются по правилам DDS. Данные не копируются в отдельную таблицу." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/ddl/50-dds-views.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dds/event.md#user-content-форма - id: event_to_session from: dds_event to: dds_session mechanism: airflow_dag streams: [events] rhythm: при каждом запуске `dds_transform` actor: Задачи `session.rebuild` и `session.replace` дага `dds_transform`. join: "События одного `client_id` за день `event_date` упорядочиваются по времени. Пауза дольше 30 минут начинает новую сессию. Ее `session_id` рассчитывается как `cityHash64(client_id, min(event_time))`." links: - label: SQL сборки url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dds/session_rebuild.sql - label: SQL замены url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dds/session_replace.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dds/session.md#user-content-движок-и-наполнение - id: order_to_dds from: ods_order to: dds_order mechanism: airflow_dag streams: [orders] rhythm: при каждом запуске `dds_transform` actor: Задачи `order.rebuild` и `order.replace` дага `dds_transform`. join: "Поля заказа приводятся к типам DDS, а позиции из JSON разбираются в массивы. Дата `order_date` рассчитывается из `created_at`." links: - label: SQL сборки url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dds/order_rebuild.sql - label: SQL замены url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dds/order_replace.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dds/order.md#user-content-движок-и-наполнение - id: event_to_identity from: dds_event to: dds_identity mechanism: airflow_dag streams: [events] rhythm: при каждом запуске `dds_transform` actor: Задача `identity_map` дага `dds_transform` соединяет покупки с заказами. join: "Событие покупки соединяется с заказом по `purchase_id[1] = order_id`. В результате связываются посетитель сайта и пользователь магазина." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dds/identity_map_rebuild.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dds/identity.md#user-content-сборка - id: order_to_identity from: dds_order to: dds_identity mechanism: airflow_dag streams: [orders] rhythm: при каждом запуске `dds_transform` actor: Задача `identity_map` дага `dds_transform` соединяет заказы с покупками. join: "Заказ соединяется с событием покупки по `order_id = purchase_id[1]`. Из заказа берется `user_id` пользователя магазина." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dds/identity_map_rebuild.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dds/identity.md#user-content-сборка - id: session_to_traffic from: dds_session to: dm_daily_traffic mechanism: airflow_dag streams: [events] rhythm: при каждом запуске `dm_transform` actor: Задача `daily_traffic` дага `dm_transform` считает посетителей по сессиям. join: "К сессиям присоединяется карта идентичностей по `client_id`, затем данные группируются по `session_date`. Эта дата записывается в `report_date`." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dm/daily_traffic_rebuild.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dm.md#user-content-dmdaily_traffic_v - id: identity_to_traffic from: dds_identity to: dm_daily_traffic mechanism: airflow_dag streams: [events] rhythm: при каждом запуске `dm_transform` actor: Задача `daily_traffic` дага `dm_transform` считает известных пользователей по `client_id`. join: "`GLOBAL LEFT JOIN` присоединяет карту идентичностей к сессиям по `client_id`. Сессии без известного пользователя тоже участвуют в расчете посетителей." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dm/daily_traffic_rebuild.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dm.md#user-content-dmdaily_traffic_v - id: order_to_revenue from: dds_order to: dm_revenue mechanism: airflow_dag streams: [orders] rhythm: при каждом запуске `dm_transform` actor: Задачи `revenue_daily.rebuild` и `revenue_daily.replace` дага `dm_transform`. join: "`ARRAY JOIN` разворачивает массивы `item_sku`, `item_quantity`, `item_price` в строки позиций заказа. Выручка считается по оплаченным заказам; `order_date` записывается в `report_date`." links: - label: SQL сборки url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dm/revenue_daily_rebuild.sql - label: SQL замены url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dm/revenue_daily_replace.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dm.md#user-content-dmrevenue_daily_v - id: products_to_revenue from: dic_products to: dm_revenue mechanism: airflow_dag streams: [orders] rhythm: при каждом запуске `dm_transform` actor: "Задача `revenue_daily.rebuild` дага `dm_transform`." join: "Функция `dictGet` получает категорию товара по артикулу `item_sku` из заказа. В словаре этому артикулу соответствует ключ `sku`." links: - label: SQL url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dm/revenue_daily_rebuild.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dm.md#user-content-dmrevenue_daily_v - id: event_to_purchase from: dds_event to: dm_purchase mechanism: airflow_dag streams: [events] rhythm: при каждом запуске `dm_transform` actor: Задачи `purchase_vs_orders.rebuild` и `purchase_vs_orders.replace` дага `dm_transform` читают покупки. join: "События покупки группируются по номеру `purchase_id[1]`, который получает имя `purchase_order_id`. Дата `event_date` записывается в `purchase_day`. Затем `GLOBAL FULL OUTER JOIN` сопоставляет покупки с заказами по `purchase_order_id = backend_order_id`." links: - label: SQL сборки url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dm/purchase_vs_orders_rebuild.sql - label: SQL замены url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dm/purchase_vs_orders_replace.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dm.md#user-content-dmpurchase_vs_orders_v - id: order_to_purchase from: dds_order to: dm_purchase mechanism: airflow_dag streams: [orders] rhythm: при каждом запуске `dm_transform` actor: Задачи `purchase_vs_orders.rebuild` и `purchase_vs_orders.replace` дага `dm_transform` читают заказы. join: "`order_id` заказа получает имя `backend_order_id`, а `purchase_id[1]` покупки — `purchase_order_id`. `GLOBAL FULL OUTER JOIN` соединяет их по `purchase_order_id = backend_order_id`. Покупки без заказа и заказы без покупки сохраняются; поля отсутствующей стороны содержат `NULL`." links: - label: SQL сборки url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dm/purchase_vs_orders_rebuild.sql - label: SQL замены url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/sql/dm/purchase_vs_orders_replace.sql - label: Справочник url: https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/architecture/dm.md#user-content-dmpurchase_vs_orders_v