В проекте «Гонца» с десяток моделей: представления, таблицы, эфемерные шаги, инкрементальная витрина. И начались неприятности. Финансы прислали отчёт, где опаздывает 1% доставок, а у Отто на дашборде 27%. Оказалось, финансист написал свою модель прямо по сырым таблицам и сравнил время доставки в UTC с обещанным местным временем. Правило «что считать опозданием» живёт в двух местах, и в одном оно неверное. Пора договориться, какая модель за что отвечает.
Кухня ресторана
На кухне ресторана три зоны. Заготовочный цех моет и чистит продукты, которые привёз поставщик: картошку от земли, рыбу от чешуи. Он ничего не придумывает, только приводит сырьё в порядок, и каждую позицию со склада чистит один раз. Горячий цех из заготовок делает полуфабрикаты: обжаренный лук, соус, отварной рис. Раздача собирает из полуфабрикатов блюда, которые уходят в зал.
Повар раздачи не чистит картошку сам, он берёт её из заготовочного цеха. Иначе каждое блюдо чистило бы картошку по-своему.
Три слоя dbt
В dbt-проектах модели так же делят на слои. Каждый слой лежит в своей папке внутри models/, а имя модели начинается с приставки слоя.
staging, приставка stg_. Staging-модели это заготовочный цех. Одна модель на одну сырую таблицу: переименовать id в order_id, привести типы, перевести время в нужный пояс. Никаких соединений с другими таблицами и никаких метрик. Только staging читает источники через source(), все остальные модели берут staging через ref(). У «Гонца» stg_orders переводит время приложения курьера из UTC в местное, и больше никто в проекте об этом не думает.
intermediate, приставка int_. Промежуточные модели это горячий цех. Здесь соединяют таблицы, отбирают нужные строки и считают то, что понадобится нескольким витринам. У «Гонца» int_deliveries оставляет только чистые доставки, без 24 заказов, где доставка случилась раньше, чем курьер забрал заказ, и считает опоздание в минутах. Снаружи этот слой обычно не читают, поэтому в проекте он эфемерный.
marts, витрины. Витрины это раздача. Их читают дашборды и люди. Здесь живут факты с приставкой fct_ и измерения с приставкой dim_. Это та самая схема звезды из урока про моделирование: fct_deliveries с одной строкой на доставку и dim_couriers с одной строкой на курьера.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.