Purchase с выручкой: форма события и место в стенде #15
Notifications
Due Date
No due date set.
Blocks
#17 Собрать спеку боевого реализма
ddmitry/clickstream-ch-kafka-superset-demo
#16 Анонимы и identity stitching: нужно ли и сколько
ddmitry/clickstream-ch-kafka-superset-demo
Reference: ddmitry/clickstream-ch-kafka-superset-demo#15
Reference in New Issue
Block a user
Part of #10
Question
Решить форму события покупки с суммой заказа: схема и носитель
(клиентское событие в широкой модели, источник заказов бэкенда или
обе стороны со сверкой — зависит от решения «Модель данных» #18),
как ложится в DDL/DM и дашборд, что делает с эталонным миром
(пересборка артефакта и чисел лаб).
Комментарий владельца (перенос с GitHub, dementev-dev): решение #18
добавило вторую сущность: заказ бэкенда (Kafka, пачками, с опозданиями
и отменами). При решении формы purchase решить и форму события заказа,
и сюжет сверки «клиентский purchase против бэкенд-заказа». Фактура по
ecommerce Яндекса — в docs/research/2026-07-26-yandex-clickstream-format.md.
Blocked by: #11, #18 (обе закрыты). Перенесено с GitHub 2026-07-26.
Резолюция (дословный перенос с GitHub, автор dementev-dev, issues/15#issuecomment-5084445090):
Ответ
Сумма заказа живёт на обеих сторонах, и стороны законно расходятся:
клиентское событие несёт объявленную сумму (то, что сайт продиктовал трекеру
через dataLayer — до пересчёта на бэкенде), заказ бэкенда — итоговую правду
со статусами. Правило стенда: поведение и атрибуцию считаем по трекеру,
деньги — по бэкенду. Правило выучивается на конфликте: суммы у менти
не сойдутся, и он сам раскопает почему.
Клиентская сторона (широкое событие, рамка #18)
pageview+add_to_cart+purchase.Полный словарь Метрики (
detail,remove,impressions) не берём:механика та же, объём массивов большой, новых идей нет — остаётся теорией
в документе о реализме.
purchaseнесётpurchaseID/Revenue/Currency/Coupon+ массивыproduct*состава заказа + сырую строку
ecommerce(по образцу выгрузки Метрики,фактура — #27).
add_to_cart— массивыproduct*с одним товаром. Оживают мёртвыесчётчики
purchases/add_to_cartsвv_utm_effectivenessбез правки витрины.Сторона бэкенда (второй источник, рамка #18)
изменяемости K дней. Запись = снапшот заказа:
order_id,user_id,времена,
status(created/paid/cancelled),updated_at, итоговыесуммы (товары / скидка / доставка / итого) + позиции вложенным JSON
(
items: [{sku, qty, price}]) — «родной» экспорт бэкенда, а не диалектМетрики.
идемпотентный приём и самовосстановление (пропущенный день ничего не
ломает); дедуп до последней версии становится обязательным с первого дня.
Окно K делает объём защитимым (за окном заказ неизменяем — возить незачем)
и даёт границу пересчёта: выручка дня D «дышит» K дней, потом замерзает.
ReplacingMergeTree/argMax; разбор JSON-позиций —один раз в трансформации ODS → DDS, дальше витрины работают с плоскими
массивами. Это единственный носитель навыка «вложенный JSON в ClickHouse»
в стенде.
docs/generator-realism.md— честный абзац trade-off «инкремент экономнее,слепок надёжнее» и сноска про compacted topic как родной Kafka-паттерн
для состояния сущности.
Сверка
purchaseID=order_idбэкенда (магазин знает номерзаказа на
/confirmation— какactionField.idу Метрики).детерминированных от seed:
purchaseесть, заказ дошёл доstatus='cancelled'(бесплатно из статусов);
purchaseне доехал(вероятность в генераторе);
сумму товаров до промокода и доставки, бэкенд — итог; менти может вывести
формулу связи;
purchaseот обновления/confirmation(вероятность).появляется в слепке D+1/D+2) — «вчера не сходилось, сегодня сошлось».
клиент/сервер — это жители тумана «Грязь в данных», придут своим тикетом.
Слои и витрины
dds.order(последняя версия заказа, позицииразобраны в массивы).
purchaseотдельной сущности не получает — этострока широкого события.
v_revenue_daily, по категориям черезdictGetкаталога) — строится только от заказов; сверка
(
v_purchase_vs_orders) — FULL OUTER JOIN по ключу с классификаторомрасхождения; атрибуция (
v_utm_effectiveness) — остаётся клиентской,плюс объявленная выручка по UTM. Точный состав колонок — в спеку (#17).
Эталонный мир
Пересборка артефакта неизбежна и уже оплачена решением #18; этот тикет
нагружает её смыслом: манифест расширяется контрольными числами заказной
стороны — заказы и выручка по дням, и ровно N потерянных / M дублей /
K отмен для самопроверки лабы сверки. Политика версионирования артефакта
здесь не решается (пункт тумана карты).
Ограничения исполнения и страховочные срезы
Аудитория — джун после базовой программы: расхождения — перечислимый список,
не хаос. Если при сборке спеки (#17) суммарный объём испугает, резать в
порядке: (1) статусы сузить до
created/cancelled— урок дедупа держитсяна самом слепке; (2) расхождения вводить поэтапно — сначала A+C, потом B+D;
(3) окно K сделать константой мира, а не параметром.
Отклонено по дороге
Событийный лог заказов (сборка автомата — дальше от типовой работы DE),
CDC-формат (имитация Debezium без Debezium), шапка+строки (воскрешает склейку
по ключам), отдельный поток возвратов, полный словарь торговых событий
Метрики, механика Sign/CollapsingMergeTree (остаётся кандидатом на потом,
её дом — клиентская сторона, поток визитов Метрики Про, не заказы).
Фактура:
docs/research/2026-07-26-yandex-clickstream-format.md(#27),резолюция «Модель данных» (#18).
ddmitry referenced this issue2026-07-26 21:55:17 +03:00