Команды MetricFlow
После того как вы определите метрики в своём проекте dbt, вы сможете запрашивать метрики, измерения и значения измерений, а также проверять корректность конфигураций с помощью команд MetricFlow.
MetricFlow позволяет определять и запрашивать метрики в вашем проекте dbt в dbt или dbt Core. Чтобы воспользоваться возможностями универсального Semantic Layer и динамически запрашивать эти метрики в downstream‑инструментах, вам понадобится аккаунт dbt уровня Starter, Enterprise или Enterprise+.
MetricFlow совместим с версиями Python 3.8, 3.9, 3.10, 3.11 и 3.12.
MetricFlow
MetricFlow — это пакет dbt, который позволяет определять и запрашивать метрики в вашем проекте dbt. Вы можете использовать MetricFlow для запросов метрик в проекте dbt через CLI dbt, Studio IDE или dbt Core.
Использование MetricFlow с dbt означает, что вам не нужно управлять версиями — ваш аккаунт dbt автоматически занимается управлением версиями.
Задания dbt поддерживают команду dbt sl validate для автоматического тестирования семантических узлов. Вы также можете добавить проверки MetricFlow в интеграции с вашим git‑провайдером (например, GitHub Actions), установив MetricFlow (python -m pip install metricflow). Это позволяет запускать команды MetricFlow в рамках проверок непрерывной интеграции (CI) для pull request’ов.
- MetricFlow with the dbt platform
- MetricFlow с dbt Core
В dbt вы можете запускать команды MetricFlow напрямую в Studio IDE или в Cloud CLI.
Для пользователей Cloud CLI команды MetricFlow встроены в Cloud CLI, что означает, что вы можете сразу же запускать их после установки Cloud CLI и вам не нужно устанавливать MetricFlow отдельно. Вам также не нужно управлять версиями, поскольку ваш аккаунт dbt автоматически делает это за вас.
Вы можете установить MetricFlow из PyPI. Вам нужно использовать pip для установки MetricFlow на операционных системах Windows или Linux:
- Создайте или активируйте виртуальное окружение
python -m venv venv. - Выполните
pip install dbt-metricflow.- Вы можете установить MetricFlow через PyPI как расширение вашего dbt‑адаптера из командной строки. Чтобы установить адаптер, выполните
python -m pip install "dbt-metricflow[adapter_package_name]"и укажите имя адаптера в конце команды. Например, для адаптера Snowflake выполнитеpython -m pip install "dbt-metricflow[dbt-snowflake]".
- Вы можете установить MetricFlow через PyPI как расширение вашего dbt‑адаптера из командной строки. Чтобы установить адаптер, выполните
Примечание: вам потребуется самостоятельно управлять версиями между dbt Core, вашим адаптером и MetricFlow.
Обратите внимание, команды MetricFlow mf возвращают ошибку, если у вас установлен пакет Metafont latex. Чтобы запустить команды mf, удалите этот пакет.
Команды MetricFlow
MetricFlow предоставляет следующие команды для получения метаданных и запроса метрик.
- Commands for the dbt platform
- Команды для dbt Core
Вы можете использовать префикс dbt sl перед именем команды, чтобы выполнять их в Studio IDE или Cloud CLI. Например, чтобы вывести список всех метрик, выполните команду dbt sl list metrics.
Пользователи Cloud CLI могут выполнить dbt sl --help в терминале, чтобы получить полный список команд и флагов MetricFlow.
В следующей таблице перечислены команды, совместимые с Studio IDE и Cloud CLI:
| Loading table... |
Когда вы вносите изменения в метрики, обязательно как минимум выполните команду dbt parse, чтобы обновить Semantic Layer. Это обновит файл semantic_manifest.json, отразив ваши изменения при выполнении запросов к метрикам. При запуске dbt parse вам не потребуется пересобирать все модели.
Используйте префикс mf перед именем команды, чтобы выполнить их в dbt Core. Например, чтобы перечислить все метрики, выполните mf list metrics.
list metrics— Перечисляет метрики с измерениями.list dimensions— Перечисляет уникальные измерения для метрик.list dimension-values— Перечисляет измерения с метриками.list entities— Перечисляет все уникальные сущности.validate-configs— Проверяет конфигурации семантической модели.health-checks— Выполняет проверку состояния платформы данных.tutorial— Посвященный учебник MetricFlow, чтобы помочь вам начать.query— Запрос метрик и измерений, которые вы хотите увидеть в интерфейсе командной строки. Обратитесь к примерам запросов, чтобы помочь вам начать.
List metrics
Эта команда выводит список метрик с указанием доступных для них измерений (dimensions):
dbt sl list metrics <metric_name> # На платформе dbt
mf list metrics <metric_name> # В dbt Core
Опции:
--search TEXT Фильтровать доступные метрики по этому поисковому запросу
--show-all-dimensions Показать все измерения, связанные с метрикой.
--help Показать это сообщение и выйти.
List dimensions
Эта команда перечисляет все уникальные измерения для метрики или нескольких метрик. Она отображает только общие измерения при запросе нескольких метрик:
dbt sl list dimensions --metrics <metric_name> # На платформе dbt
mf list dimensions --metrics <metric_name> # В dbt Core
Опции:
--metrics SEQUENCE Перечислить измерения по заданным метрикам (пересечение). Например, --metrics bookings,messages
--help Показать это сообщение и выйти.
List dimension-values
Эта команда перечисляет все значения измерений с соответствующей метрикой:
dbt sl list dimension-values --metrics <metric_name> --dimension <dimension_name> # На платформе dbt
mf list dimension-values --metrics <metric_name> --dimension <dimension_name> # В dbt Core
Options:
--dimension TEXT Измерение, из которого нужно получить значения [required]
--metrics SEQUENCE Метрики, которые связаны с данным измерением
[required]
--end-time TEXT Необязательная временная метка в формате iso8601,
ограничивающая конечный момент времени данных (включительно)
*Пока недоступно в dbt platform
--start-time TEXT Необязательная временная метка в формате iso8601,
ограничивающая начальный момент времени данных (включительно)
*Пока недоступно в dbt platform
--help Показать это сообщение и выйти.
List entities
Эта команда перечисляет все уникальные сущности:
dbt sl list entities --metrics <metric_name> # На платформе dbt
mf list entities --metrics <metric_name> # В dbt Core
Опции:
--metrics SEQUENCE Перечислить сущности по заданным метрикам (пересечение). Например, --metrics bookings,messages
--help Показать это сообщение и выйти.
List saved queries
Эта команда перечисляет все доступные сохраненные запросы:
dbt sl list saved-queries
Вы также можете добавить флаг (или опцию) --show-exports, чтобы показать каждый экспорт, перечисленный под сохраненным запросом:
dbt sl list saved-queries --show-exports
Вывод
dbt sl list saved-queries --show-exports
Список доступных сохраненных запросов:
- new_customer_orders
экспорты:
- Export(new_customer_orders_table, exportAs=TABLE)
- Export(new_customer_orders_view, exportAs=VIEW)
- Export(new_customer_orders, alias=orders, schemas=customer_schema, exportAs=TABLE)
Validate
Следующая команда выполняет проверки против определенных конфигураций семантической модели.
dbt sl validate # Для пользователей dbt
mf validate-configs # Для пользователей dbt Core
Опции:
--timeout # только для dbt platform
Необязательный тайм-аут для проверки
хранилища данных в dbt platform.
--dw-timeout INTEGER # только для dbt Core
Необязательный тайм-аут для этапов
валидации хранилища данных.
По умолчанию: None.
--skip-dw # только для dbt Core
Пропускает проверки хранилища данных.
--show-all # только для dbt Core
Выводит предупреждения и будущие ошибки.
--verbose-issues # только для dbt Core
Выводит дополнительные детали по проблемам.
--semantic-validation-workers INTEGER # только для dbt Core
Использует указанное количество воркеров
для обработки больших конфигураций.
--help Показывает это сообщение и завершает работу.
Проверка состояния
Следующая команда выполняет проверку состояния платформы данных, которую вы указали в конфигурациях.
Обратите внимание: в dbt команда health-checks не требуется, так как для выполнения проверки состояния используются учетные данные dbt.
mf health-checks # В dbt Core
Руководство (tutorial)
Следуйте специальному руководству по MetricFlow, чтобы быстрее начать работу:
mf tutorial # В dbt Core
Query
Создайте новый запрос с помощью MetricFlow и выполните его на вашей платформе данных. Запрос возвращает следующий результат:
dbt sl query --metrics <metric_name> --group-by <dimension_name> # На платформе dbt
dbt sl query --saved-query <name> # На платформе dbt
mf query --metrics <metric_name> --group-by <dimension_name> # В dbt Core
Опции:
--metrics SEQUENCE Синтаксис для запроса одной метрики: --metrics metric_name
Например, --metrics bookings
Чтобы запросить несколько метрик, используйте --metrics, за которым следуют имена метрик, разделенные запятыми без пробелов.
Например, --metrics bookings,messages
--group-by SEQUENCE Синтаксис для группировки по одному измерению/сущности: --group-by dimension_name
Например, --group-by ds
Для нескольких измерений/сущностей используйте --group-by, за которым следуют имена измерений/сущностей, разделенные запятыми без пробелов.
Например, --group-by ds,org
--end-time TEXT Необязательная временная метка в формате iso8601,
задающая конечный момент данных (включительно).
*Пока недоступно в dbt platform
--start-time TEXT Необязательная временная метка в формате iso8601,
задающая начальный момент данных (включительно)
*Пока недоступно в dbt platform
--where TEXT SQL‑подобное условие where, передаваемое в виде строки и обязательно заключённое в кавычки.
Все элементы фильтра должны явно ссылаться на поля или измерения (dimensions), которые являются частью вашей модели.
Запрос с одним условием: --where "{{ Dimension('order_id__revenue') }} > 100"
Запрос с несколькими условиями: --where "{{ Dimension('order_id__revenue') }} > 100" --where "{{ Dimension('user_count') }} < 1000" # обязательно заключайте каждое условие в кавычки
Чтобы добавить фильтр по измерению, используйте шаблонную обёртку `Dimension()`, которая указывает, что элемент фильтра является частью вашей модели.
Подробнее о том, как это делать с помощью шаблонной обёртки, см. в разделе FAQ.
--limit TEXT Ограничить количество строк, используя int, или оставить
пустым для отсутствия ограничения. Например: --limit 100
--order-by SEQUENCE Укажите метрики, измерения или группировки для сортировки.
Добавьте префикс `-`, чтобы отсортировать запрос в порядке убывания (DESC).
Оставьте пустым для сортировки в порядке возрастания (ASC).
Например, чтобы отсортировать metric_time в порядке убывания: --order-by -metric_time
Чтобы отсортировать metric_time в порядке возрастания и revenue в порядке убывания: --order-by metric_time,-revenue
--csv FILENAME Укажите путь к файлу для вывода фрейма данных в csv
--compile (the dbt platform) В выводе запроса показать SQL‑запрос, который был скомпилирован dbt.
--explain (dbt Core) В выводе запроса показать SQL‑запрос, который был выполнен в хранилище данных.
--show-dataflow-plan Показать план потока данных в выводе объяснения
--display-plans Показать планы (например, поток данных метрик) в браузере
--decimals INTEGER Выберите количество десятичных знаков для округления
числовых значений
--show-sql-descriptions Показать встроенные описания узлов в отображаемом SQL
--help Показать это сообщение и выйти.
Примеры запросов
Query examples
В этом разделе приведены различные типы примеров запросов, которые вы можете использовать для выполнения запросов к метрикам и измерениям. В разделе представлены следующие примеры запросов:
- Query metrics
- Query dimensions
- Add
order/limitfunction - Add
whereclause - Filter by time
- Query saved queries
Метрики запросов
Используйте этот пример, чтобы запросить несколько метрик по измерению и вернуть метрики order_total и users_active по metric_time.
Запрос
dbt sl query --metrics order_total,users_active --group-by metric_time # На платформе dbt
mf query --metrics order_total,users_active --group-by metric_time # В dbt Core
Результат
✔ Успех 🦄 - запрос завершен через 1.24 секунды
| METRIC_TIME | ORDER_TOTAL |
|:--------------|---------------:|
| 2017-06-16 | 792.17 |
| 2017-06-17 | 458.35 |
| 2017-06-18 | 490.69 |
| 2017-06-19 | 749.09 |
| 2017-06-20 | 712.51 |
| 2017-06-21 | 541.65 |
Измерения запроса
Вы можете включить несколько измерений в запрос. Например, вы можете сгруппировать по измерению is_food_order, чтобы подтвердить, были ли заказы на еду или нет. Обратите внимание, что при запросе измерения вам нужно указать основную сущность для этого измерения. В следующем примере основной сущностью является order_id.
Запрос
dbt sl query --metrics order_total --group-by order_id__is_food_order # На платформе dbt
mf query --metrics order_total --group-by order_id__is_food_order # В dbt Core
Результат
Успех 🦄 - запрос завершен через 1.70 секунды
| METRIC_TIME | IS_FOOD_ORDER | ORDER_TOTAL |
|:--------------|:----------------|---------------:|
| 2017-06-16 | True | 499.27 |
| 2017-06-16 | False | 292.90 |
| 2017-06-17 | True | 431.24 |
| 2017-06-17 | False | 27.11 |
| 2017-06-18 | True | 466.45 |
| 2017-06-18 | False | 24.24 |
| 2017-06-19 | False | 300.98 |
| 2017-06-19 | True | 448.11 |
Добавление order/limit
Вы можете добавить функции порядка и ограничения, чтобы отфильтровать и представить данные в читаемом формате. Следующий запрос ограничивает набор данных до 10 записей и упорядочивает их по metric_time в порядке убывания. Обратите внимание, что использование префикса - отсортирует запрос в порядке убывания. Без префикса - запрос сортируется в порядке возрастания.
Обратите внимание, что при запросе измерения вам нужно указать основную сущность для этого измерения. В следующем примере основной сущностью является order_id.
Запрос
# На платформе dbt
dbt sl query --metrics order_total --group-by order_id__is_food_order --limit 10 --order-by -metric_time
# В dbt Core
mf query --metrics order_total --group-by order_id__is_food_order --limit 10 --order-by -metric_time
Результат
✔ Успех 🦄 - запрос завершен через 1.41 секунды
| METRIC_TIME | IS_FOOD_ORDER | ORDER_TOTAL |
|:--------------|:----------------|---------------:|
| 2017-08-31 | True | 459.90 |
| 2017-08-31 | False | 327.08 |
| 2017-08-30 | False | 348.90 |
| 2017-08-30 | True | 448.18 |
| 2017-08-29 | True | 479.94 |
| 2017-08-29 | False | 333.65 |
| 2017-08-28 | False | 334.73 |
Добавление условия where
Вы можете дополнительно отфильтровать набор данных, добавив в запрос условие where. В следующем примере показано, как выполнить запрос метрики order_total, сгруппированной по is_food_order, с использованием нескольких условий where (заказы, которые являются заказами еды, и заказы за неделю, начинающуюся не ранее 1 февраля 2024 года).
Запрос
# На платформе dbt
dbt sl query --metrics order_total --group-by order_id__is_food_order --where "{{ Dimension('order_id__is_food_order') }} = True" --where "{{ TimeDimension('metric_time', 'week') }} >= '2024-02-01'"
# В dbt Core
mf query --metrics order_total --group-by order_id__is_food_order --where "{{ Dimension('order_id__is_food_order') }} = True" --where "{{ TimeDimension('metric_time', 'week') }} >= '2024-02-01'"
Notes:
- Тип измерения влияет на синтаксис, который вы используете. Например, если у вас поле с датой, нужно использовать
TimeDimensionвместоDimension. - При выполнении запроса по измерению необходимо указывать первичную сущность (primary entity) для этого измерения. В приведённом примере первичной сущностью является
order_id.
Result
✔ Успех 🦄 - запрос завершен через 1.06 секунды
| METRIC_TIME | IS_FOOD_ORDER | ORDER_TOTAL |
|:--------------|:----------------|---------------:|
| 2017-08-31 | True | 459.90 |
| 2017-08-30 | True | 448.18 |
| 2017-08-29 | True | 479.94 |
| 2017-08-28 | True | 513.48 |
| 2017-08-27 | True | 568.92 |
| 2017-08-26 | True | 471.95 |
| 2017-08-25 | True | 452.93 |
| 2017-08-24 | True | 384.40 |
| 2017-08-23 | True | 423.61 |
| 2017-08-22 | True | 401.91 |
Фильтрация по времени
Для фильтрации по времени существуют специальные опции начала и конца времени. Использование этих опций для фильтрации по времени позволяет MetricFlow дополнительно оптимизировать производительность запроса, когда это уместно.
Обратите внимание, что при запросе измерения необходимо указать первичную сущность (primary entity) для этого измерения. В следующем примере в качестве первичной сущности используется order_id.
Query
# В dbt Core
mf query --metrics order_total --group-by order_id__is_food_order --limit 10 --order-by -metric_time --where "is_food_order = True" --start-time '2017-08-22' --end-time '2017-08-27'
Результат
✔ Успех 🦄 - запрос завершен через 1.53 секунды
| METRIC_TIME | IS_FOOD_ORDER | ORDER_TOTAL |
|:--------------|:----------------|---------------:|
| 2017-08-27 | True | 568.92 |
| 2017-08-26 | True | 471.95 |
| 2017-08-25 | True | 452.93 |
| 2017-08-24 | True | 384.40 |
| 2017-08-23 | True | 423.61 |
| 2017-08-22 | True | 401.91 |
Запрос сохранённых запросов
Вы можете использовать это для часто используемых запросов. Замените <name> на имя вашего сохраненного запроса.
Запрос
dbt sl query --saved-query <name> # На платформе dbt
mf query --saved-query <name> # В dbt Core
Например, если вы используете <Constant name="cloud" /> и у вас есть сохранённый запрос с именем new_customer_orders, вы можете выполнить команду dbt sl query --saved-query new_customer_orders.
При запросе сохраненных запросов вы можете использовать такие параметры, как where, limit, order, compile и так далее. Однако имейте в виду, что вы не можете получить доступ к параметрам metric или group_by в этом контексте. Это связано с тем, что они являются предопределенными и фиксированными параметрами для сохраненных запросов, и вы не можете изменить их во время запроса. Если вы хотите запросить больше метрик или измерений, вы можете построить запрос, используя стандартный формат.
Дополнительные примеры запросов
Следующие вкладки представляют дополнительные примеры запросов, такие как экспорт в CSV. Выберите вкладку, которая лучше всего соответствует вашим потребностям:
- Флаг --compile/--explain
- Export to CSV
Добавьте --compile (или --explain для пользователей dbt Core) в ваш запрос, чтобы увидеть SQL, сгенерированный MetricFlow.
Запрос
# На платформе dbt
dbt sl query --metrics order_total --group-by metric_time,is_food_order --limit 10 --order-by -metric_time --where "is_food_order = True" --start-time '2017-08-22' --end-time '2017-08-27' --compile
# В dbt Core
mf query --metrics order_total --group-by metric_time,is_food_order --limit 10 --order-by -metric_time --where "is_food_order = True" --start-time '2017-08-22' --end-time '2017-08-27' --explain
Результат
✔ Успех 🦄 - запрос завершен через 0.28 секунды
🔎 SQL (удалите --compile, чтобы увидеть данные, или добавьте --show-dataflow-plan, чтобы увидеть сгенерированный план потока данных):
select
metric_time
, is_food_order
, sum(order_cost) as order_total
from (
select
cast(ordered_at as date) as metric_time
, is_food_order
, order_cost
from analytics.js_dbt_sl_demo.orders orders_src_1
where cast(ordered_at as date) between cast('2017-08-22' as timestamp) and cast('2017-08-27' as timestamp)
) subq_3
where is_food_order = True
group by
metric_time
, is_food_order
order by metric_time desc
limit 10
Добавьте флаг --csv file_name.csv, чтобы экспортировать результаты вашего запроса в CSV. Флаг --csv доступен только в dbt Core и не поддерживается в dbt.
Запрос
# В dbt Core
mf query --metrics order_total --group-by metric_time,is_food_order --limit 10 --order-by -metric_time --where "is_food_order = True" --start-time '2017-08-22' --end-time '2017-08-27' --csv query_example.csv
Результат
✔ Успех 🦄 - запрос завершен через 0.83 секунды
🖨 Успешно записан вывод запроса в query_example.csv
Временная гранулярность
При желании вы можете указать гранулярность времени, на которую вы хотите агрегировать ваши данные, добавив два подчеркивания и единицу гранулярности к metric_time, глобальному временному измерению. Вы можете группировать гранулярность по: day, week, month, quarter и year.
Ниже приведен пример запроса данных метрики на месячной основе:
dbt sl query --metrics revenue --group-by metric_time__month # На платформе dbt
mf query --metrics revenue --group-by metric_time__month # В dbt Core
Export
Запустите экспорты для конкретного сохраненного запроса. Используйте эту команду для тестирования и генерации экспортов в вашей среде разработки. Вы также можете использовать флаг --select, чтобы указать конкретные экспорты из сохраненного запроса. Обратитесь к экспортам в разработке для получения дополнительной информации.
Экспорт доступен в dbt.
dbt sl export
Export-all
Запустите экспорты для нескольких сохраненных запросов одновременно. Эта команда предоставляет удобный способ управления и выполнения экспортов для нескольких запросов одновременно, экономя время и усилия. Обратитесь к экспортам в разработке для получения дополнительной информации.
Экспорт доступен в dbt.
dbt sl export-all