Перейти к основному содержимому

Команды 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’ов.

В dbt вы можете запускать команды MetricFlow напрямую в Studio IDE или в Cloud CLI.

Для пользователей Cloud CLI команды MetricFlow встроены в Cloud CLI, что означает, что вы можете сразу же запускать их после установки Cloud CLI и вам не нужно устанавливать MetricFlow отдельно. Вам также не нужно управлять версиями, поскольку ваш аккаунт dbt автоматически делает это за вас.

Команды MetricFlow

MetricFlow предоставляет следующие команды для получения метаданных и запроса метрик.

Вы можете использовать префикс dbt sl перед именем команды, чтобы выполнять их в Studio IDE или Cloud CLI. Например, чтобы вывести список всех метрик, выполните команду dbt sl list metrics.

Пользователи Cloud CLI могут выполнить dbt sl --help в терминале, чтобы получить полный список команд и флагов MetricFlow.

В следующей таблице перечислены команды, совместимые с Studio IDE и Cloud CLI:

Command
Description
Studio IDECloud CLI
list metricsВыводит список метрик с измерениями.
list dimensionsВыводит список уникальных измерений для метрик.
list dimension-valuesВыводит измерения вместе с метриками.
list entitiesВыводит список всех уникальных сущностей.
list saved-queriesВыводит список доступных сохранённых запросов. Используйте флаг --show-exports, чтобы отобразить каждый экспорт, связанный с сохранённым запросом, или --show-parameters, чтобы показать полный набор параметров запроса, которые использует каждый сохранённый запрос.
queryВыполняет запросы к метрикам, сохранённым запросам и измерениям, которые вы хотите увидеть в интерфейсе командной строки. См. примеры запросов, чтобы узнать, как запрашивать метрики и измерения (например, запрос метрик, использование фильтра where, добавление order и другое).
validateПроверяет корректность конфигураций семантических моделей.
exportЗапускает экспорты для одного сохранённого запроса с целью тестирования и генерации экспортов в среде разработки. Вы также можете использовать флаг --select, чтобы указать конкретные экспорты из сохранённого запроса.
export-allЗапускает экспорты сразу для нескольких сохранённых запросов, экономя время и усилия.
Loading table...
Запустите dbt parse, чтобы отразить изменения метрик

Когда вы вносите изменения в метрики, обязательно как минимум выполните команду dbt parse, чтобы обновить Semantic Layer. Это обновит файл semantic_manifest.json, отразив ваши изменения при выполнении запросов к метрикам. При запуске dbt parse вам не потребуется пересобирать все модели.

 Как выполнять запросы или просматривать метрики с помощью dbt CLI?

Посмотрите следующее видео с короткой демонстрацией того, как выполнять запросы или предварительный просмотр метрик с помощью Cloud CLI:

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

В этом разделе приведены различные типы примеров запросов, которые вы можете использовать для выполнения запросов к метрикам и измерениям. В разделе представлены следующие примеры запросов:

Метрики запросов

Используйте этот пример, чтобы запросить несколько метрик по измерению и вернуть метрики 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 для пользователей 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

Временная гранулярность

При желании вы можете указать гранулярность времени, на которую вы хотите агрегировать ваши данные, добавив два подчеркивания и единицу гранулярности к 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 

Часто задаваемые вопросы

 Как я могу добавить фильтр измерения к фильтру where?
 Почему мой запрос ограничен 100 строками в dbt CLI?
 Как я могу запросить несколько метрик, группировок или условий where?
 Как я могу отсортировать мой запрос в порядке возрастания или убывания?

Нашли ошибку?

0
Loading