О MetricFlow
Это руководство вводит в основные идеи MetricFlow для тех, кто только начинает знакомиться с этой функцией. MetricFlow, который поддерживает семантический слой dbt, помогает вам определять и управлять логикой метрик вашей компании. Это набор абстракций с определенной точкой зрения, который помогает потребителям данных быстро и эффективно извлекать наборы данных метрик из платформы данных.
MetricFlow обрабатывает построение SQL-запросов и определяет спецификацию для семантических моделей и метрик dbt. Он позволяет вам определять метрики в вашем проекте dbt и запрашивать их с помощью команд MetricFlow, будь то в dbt Cloud или dbt Core.
Перед началом работы учтите следующие рекомендации:
- Определяйте метрики в YAML и запрашивайте их, используя эти новые спецификации метрик.
- Вы должны использовать версию dbt 1.6 или выше, чтобы использовать MetricFlow.
- Используйте MetricFlow с Snowflake, BigQuery, Databricks, Postgres (только dbt Core) или Redshift.
- Открывайте инсайты и запрашивайте свои метрики, используя семантический слой dbt и его разнообразные доступные интеграции.
MetricFlow
MetricFlow — это инструмент генерации SQL-запросов, предназначенный для упрощения создания метрик по различным измерениям данных для разнообразных бизнес-потребностей.
- Он работает через YAML-файлы, где семантический граф связывает язык с данными. Этот граф состоит из семантических моделей (точки входа данных) и метрик (функции для создания количественных показателей).
- MetricFlow — это пакет BSL с доступным исходным кодом, совместимый с dbt версии 1.6 и выше. Специалисты по данным и энтузиасты настоятельно поощряются к участию.
- Как часть семантического слоя dbt, MetricFlow позволяет организациям определять метрики, используя абстракции YAML.
- Для запроса измерений метрик, значений измерений и проверки конфигураций используйте команды MetricFlow.
Примечание — MetricFlow в настоящее время не поддерживает встроенные функции или пакеты dbt, однако поддержка планируется в будущем.
MetricFlow придерживается следующих принципов:
- Гибкость с полнотой: Определяйте логику метрик, используя гибкие абстракции на любой модели данных.
- DRY (Don't Repeat Yourself): Минимизируйте избыточность, позволяя определять метрики, где это возможно.
- Простота с постепенной сложностью: Подходите к MetricFlow, используя знакомые концепции моделирования данных.
- Производительность и эффективность: Оптимизируйте производительность, поддерживая централизованную инженерию данных и рас пределенное владение логикой.
Семантический граф
Мы вводим новую концепцию: "семантический граф". Это отношение между семантическими моделями и конфигурациями YAML, которое создает ландшафт данных для построения метрик. Вы можете думать о нем как о карте, где таблицы подобны местам, а связи между ними (ребра) подобны дорогам. Хотя это скрыто, семантический граф является подмножеством , и вы можете видеть семантические модели как узлы на DAG.
Семантический граф помогает нам решить, какая информация доступна для использования и какая нет. Связи между таблицами в семантическом графе больше касаются отношений между информацией. Это отличается от DAG, где связи показывают зависимости между задачами.
Когда MetricFlow генерирует метрику, он использует свой SQL-движок, чтобы определить лучший путь между таблицами, используя фреймворк, определенный в YAML-файлах для семантических моделей и метрик. Когда эти модели и метрики правильно определены, они могут быть использованы далее с интеграциями семантического слоя dbt.
Семантические модели
Семантические модели являются отправными точками данных и соответствуют моделям в вашем проекте dbt. Вы можете создать несколько семантических моделей из каждой модели. Семантические модели имеют метаданные, такие как таблица данных, которые определяют важную информацию, такую как имя таблицы и первичные ключи, чтобы граф мог быть правильно навигационным.
Для семантической модели есть три основных элемента метаданных:
- Сущности — Ключи соединения вашей семантической модели (думайте о них как о путях перемещения или ребрах между семантическими моделями).
- Измерения — Это способы, которыми вы хотите группировать или разбивать ваши метрики.
- Меры — Функции агрегации, которые дают вам числов ой результат и могут быть использованы для создания ваших метрик.
Метрики
Метрики, являющиеся ключевой концепцией, это функции, которые объединяют меры, ограничения или другие математические функции для определения новых количественных показателей. MetricFlow использует меры и различные типы агрегации, такие как среднее, сумма и количество уникальных, для создания метрик. Измерения добавляют контекст к метрикам, и без них метрика просто число за все время. Вы можете определять метрики в тех же YAML-файлах, что и ваши семантические модели, или создать новый файл.
MetricFlow поддерживает различные типы метрик:
- Конверсия — Помогает отслеживать, когда базовое событие и последующее событие конверсии происходят для сущности в заданный период времени.
- Кумулятивная — Агрегирует меру за заданное окно.
- Производная — Выражение других метрик, которое позволяет выполнять вычисления на основе метрик.
- Отношение — Создает отношение из двух мер, например, доход на клиента.
- Простая — Метрики, которые напрямую ссылаются на одну меру.
Пример использования
В следующих разделах мы покажем, как специалисты по данным в настоящее время рассчитывают метрики и сравним это с тем, как MetricFlow упрощает и делает более гибким определение метрик.
Следующий пример данных основан на репозитории Jaffle Shop. Вы можете просмотреть полный проект dbt. Таблицы, которые мы используем в нашем примерной модели:
orders
— это экспорт производственной платформы данных, который был очищен и организован для аналитического потребления.customers
— это частично денормализованная таблица в данном случае с колонкой, полученной из таблицы заказов через некоторый процесс на более высоком уровне.
Чтобы сделать это более конкретным, рассмотрим метрику order_total
, которая определяется с использованием SQL-выражения:
select sum(order_total) as order_total from orders
Это выражение вычисляет общий доход от всех заказов, суммируя колонку order_total в таблице orders. В бизнес-среде метрика order_total часто рассчитывается по различным категориям, таким как:
- Время, например
date_trunc(ordered_at, 'day')
- Тип заказа, используя измерение
is_food_order
из таблицыorders
.
Расчет метрик
Далее мы сравним, как специалисты по данным в настоящее время рассчитывают метрики с помощью нескольких запросов, и как MetricFlow упрощает и оптимизирует этот процесс.
- Расчет с помощью нескольких запросов
- Расчет с помощью MetricFlow
Следующий пример показывает, как специалисты по данным обычно рассчитывают метрику order_total
в агрегированном виде. Также вероятно, что аналитиков просят предоставить больше деталей по метрике, например, сколько дохода поступило от новых клиентов.
Использование следующего запроса создает ситуацию, когда несколько аналитиков работают с одними и теми же данными, каждый используя свой метод запроса — это может привести к путанице, несоответствиям и головной боли для управления данными.
select
date_trunc('day',orders.ordered_at) as day,
case when customers.first_ordered_at is not null then true else false end as is_new_customer,
sum(orders.order_total) as order_total
from
orders
left join
customers
on
orders.customer_id = customers.customer_id
group by 1, 2
В следующих трех примерах вкладок используйте MetricFlow для определения семантической модели, которая использует order_total в качестве метрики и примерную схему для создания последовательных и точных результатов — устраняя путаницу, дублирование кода и оптимизируя ваш рабочий процесс.
- Пример дохода
- Пример с дополнительными измерениями
- Продвинутый пример
В этом примере мера с именем order_total
определяется на основе колонки order_total в таблице orders
.
Измерение времени metric_time
обеспечивает дневную детализацию и может быть агрегировано в недельные или месячные периоды. Кроме того, категориальное измерение под названием is_new_customer
указано в семантической модели customers
.
semantic_models:
- name: orders # Имя семантической модели
description: |
Модель, содержащая данные о заказах. Зерно таблицы — это идентификатор заказа.
model: ref('orders') # Имя модели и схемы dbt
defaults:
agg_time_dimension: metric_time
entities: # Сущности, которые обычно соответствуют ключам в таблице.
- name: order_id
type: primary
- name: customer
type: foreign
expr: customer_id
measures: # Меры, которые являются агрегациями на колонках в таблице.
- name: order_total
agg: sum
dimensions: # Измерения могут быть категориальными или временными. Они добавляют допо лнительный контекст к метрикам, и типичный шаблон запроса — Метрика по Измерению.
- name: metric_time
expr: cast(ordered_at as date)
type: time
type_params:
time_granularity: day
- name: customers # Имя второй семантической модели
description: >
Таблица измерений клиентов. Зерно таблицы — одна строка на клиента.
model: ref('customers') # Имя модели и схемы dbt
defaults:
agg_time_dimension: first_ordered_at
entities: # Сущности, которые обычно соответствуют ключам в таблице.
- name: customer
type: primary
expr: customer_id
dimensions: # Измерения могут быть категориальными или временными. Они добавляют дополнительный контекс т к метрикам, и типичный шаблон запроса — Метрика по Измерению.
- name: is_new_customer
type: categorical
expr: case when first_ordered_at is not null then true else false end
- name: first_ordered_at
type: time
type_params:
time_granularity: day
Аналогично, вы можете добавить дополнительные измерения, такие как is_food_order
, в ваши семантические модели, чтобы включить еще больше измерений для разбивки вашего дохода order_total.
semantic_models:
- name: orders
description: |
Модель, содержащая данные о заказах. Зерно таблицы — это идентификатор заказа.
model: ref('orders') # Имя модели и схемы dbt
defaults:
agg_time_dimension: metric_time
entities: # Сущности, которые обычно соответствуют ключам в таблице
- name: order_id
type: primary
- name: customer
type: foreign
expr: customer_id
measures: # Меры, которые являются агрегациями на колонках в таблице.
- name: order_total
agg: sum
dimensions: # Измерения могут быть категориальными или временными. Они добавляют дополнительный контекст к метрикам, и типичный шаблон запроса — Метрика по Измерению.
- name: metric_time
expr: cast(ordered_at as date)
type: time
type_params:
time_granularity: day
- name: is_food_order
type: categorical
Представьте, что требуется еще более сложная метрика, например, сумма денег, заработанных каждый день от заказов на еду от возвращающихся клиентов. Без MetricFlow исходный SQL специалиста по данным может выглядеть так:
select
date_trunc('day',orders.ordered_at) as day,
sum(case when is_food_order = true then order_total else null end) as food_order,
sum(orders.order_total) as sum_order_total,
food_order/sum_order_total
from
orders
left join
customers
on
orders.customer_id = customers.customer_id
where
case when customers.first_ordered_at is not null then true else false end = true
group by 1
MetricFlow упрощает процесс SQL через конфигурации метрик в YAML, как показано ниже. Вы также можете зафиксировать их в вашем git-репозитории, чтобы все в команде данных и бизнеса могли видеть и утверждать их как истинный и единственный источник информации.
metrics:
- name: food_order_pct_of_order_total_returning
description: Доход от заказов на еду от возвращающихся клиентов
label: "Процент еды от общего заказа"
type: ratio
type_params:
numerator: food_order
denominator: order_total
filter: |
{{ Dimension('customer__is_new_customer') }} = false