Рефакторинг существующего сводного отчета
Новый подход
Теперь, когда мы подготовили почву, пришло время углубиться в интересную и сложную часть: как мы можем преобразовать существующий сводный отчет в dbt в семантические модели и метрики?
Давайте р ассмотрим различия, которые мы можем наблюдать в подходе с использованием MetricFlow, усиливающего dbt, по сравнению с работой без семантического слоя. Эти различия могут помочь нам в структурировании.
- 🍊 В dbt мы склонны создавать сильно денормализованные наборы данных, которые объединяют все, что вам нужно вокруг определенной сущности или процесса, в одну таблицу.
- 💜 Проблема в том, что это ограничивает доступную для MetricFlow размерность. Чем больше мы предварительно вычисляем и "замораживаем", тем менее гибкими становятся наши данные.
- 🚰 В MetricFlow мы стремимся к сильно нормализованным данным, похожим на звездную схему, что позволяет MetricFlow блестяще работать как движок денормализации.
- ∞ Другой способ взглянуть на это: вместо того чтобы двигаться по списку приоритетов, пытаясь заранее создать как можно больше комбинаций наших витрин — увеличивая количество строк кода и сложность — мы можем позволить MetricFlow представить все возможные комбинации без специального кодирования.
- 🏗️ Чтобы оптимально разрешить эти подходы, нам нуж но будет изменить некоторые фундаментальные аспекты нашей стратегии моделирования.
Шаги по рефакторингу
Мы рекомендуем поэтапный процесс внедрения, который выглядит примерно так:
- 👉 Определите важный результат (например, график доходов на панели управления и модель витрины, которая предоставляет этот результат).
- 🔍 Изучите все сущности, которые являются компонентами этого сводного отчета (например, сводный отчет
active_customers_per_week
может включать данные о клиентах, доставке и продуктах). - 🛠️ Создайте семантические модели для всех базовых компонентных витрин.
- 📏 Создайте метрики для необходимых агрегатов в сводном отчете.
- 👯 Создайте клон результата на основе семантического слоя.
- 💻 Проведите аудит, чтобы убедиться в точности результатов.
- 👉 Определите любые другие результаты, которые указывают на сводный отчет, и переместите их в семантический слой.
- ✌️ Разработайте план поэтапного отказа от теперь уже лишнего замороженного сводного отчета.
Затем вы продолжите этот процесс для других результатов и витрин, двигаясь по списку приоритетов. Каждая модель по мере продвижения будет создаваться быстрее и проще, так как вы будете повторно использовать многие из тех же компонентов, которые уже были семантически смоделированы.
Давайте создадим метрику revenue
До сих пор мы работали с новыми моделями, указывающими на модель на этапе подготовки, чтобы упростить процесс создания новых ментальных моделей для MetricFlow. На практике, если вы не внедряете MetricFlow в новый проект dbt, вам, вероятно, придется провести некоторый рефакторинг. Давайте подробн о рассмотрим это.
- 📚 Согласно вышеуказанным шагам, предположим, что мы определили нашу цель как сводный отчет по доходам, который построен на основе
orders
иorder_items
. Теперь нам нужно определить все базовые компоненты, это будут все 'import' CTE в начале этих витрин. В проекте Jaffle Shop нам понадобятся:orders
,order_items
,products
,locations
иsupplies
. - 🗺️ Далее мы создадим семантические модели для всех этих компонентов. Давайте сначала рассмотрим простое преобразование с
locations
. - ⛓️ Сначала мы должны решить, нужно ли нам выполнять какие-либо объединения, чтобы привести данные в нужную форму для нашей семантической модели. Основными факторами, определяющими это, являются два аспекта:
- 📏 Содержит ли эта семантическая модель измерения?
- 🕥 Имеет ли эта семантическая модель основную временную метку?
- 🫂 Если семантическая модель имеет измерения, но не имеет временной метки (например, supplies в проекте, где указаны статические затраты на поставки), вам, вероятно, придется пожертвовать некоторой нормализацией и присоединить ее к другой модели, которая имеет основную временную метку, чтобы обеспечить агрегацию метрик.
- 🔄 Если нам не нужны объединения, мы просто перейдем к модели на этапе подготовки для
ref
нашей семантической модели. Locations имеет измерениеtax_rate
, но также имеет временную меткуordered_at
, поэтому мы можем перейти прямо к модели на этапе подготовки здесь. - 🥇 Мы указываем нашу основную сущность (на основе
location_id
), размерности (одна категориальная,location_name
, и одна основная временная размерностьopened_at
), и, наконец, наши измерения, в данном случае толькоaverage_tax_rate
.
semantic_models:
- name: locations
description: |
Таблица размерности местоположений. Зерно таблицы — одна строка на местоположение.
model: ref('stg_locations')
entities:
- name: location
type: primary
expr: location_id
dimensions:
- name: location_name
type: categorical
- name: date_trunc('day', opened_at)
type: time
type_params:
time_granularity: day
measures:
- name: average_tax_rate
description: Средняя налоговая ставка.
expr: tax_rate
agg: avg