Joins
Соединения являются мощной частью MetricFlow и упрощают процесс предоставления всех доступных измерений для ваших метрик во время выполнения запроса, независимо от того, где они определены в различных семантических моделях. С помощью соединений вы также можете создавать метрики, используя меры из разных семантических моделей.
Соединения используют entities, определенные в конфигурациях вашей семантической модели, в качестве ключей соединения между таблицами. Предполагая, что сущности определены в семантической модели, MetricFlow создает граф, используя семантические модели в каче стве узлов и пути соединения в качестве ребер для автоматического выполнения соединений. MetricFlow выбирает подходящий тип соединения и избегает фан-аут или хазм соединений с другими таблицами на основе типов сущностей.
Что такое фан-аут или хазм соединения?
— Хазм соединения возникают, когда две таблицы имеют отношение многие ко многим через промежуточную таблицу, и соединение приводит к дублированию или отсутствию данных.
Типы соединений
MetricFlow автоматически генерирует необходимые соединения с определенными семантическими объектами, устраняя необходимость создания новых семантических моделей или конфигурационных файлов.
Этот документ объясняет различные типы соединений, которые могут быть использованы с сущностями, и как их запрашивать с помощью CLI.
MetricFlow в основном использует левые соединения и ограничивает использование фан-аут и хазм соединений. Обратитесь к таблице ниже, чтобы определить, какие соединения разрешены или не разрешены на основе конкретных типов сущностей, чтобы предотвратить создание рискованных соединений.
| entity type - Table A | entity type - Table B | Join type |
|---|---|---|
| Primary | Primary | ✅ Left |
| Primary | Unique | ✅ Left |
| Primary | Foreign | ❌ Fan-out (Not allowed) |
| Unique | Primary | ✅ Left |
| Unique | Unique | ✅ Left |
| Unique | Foreign | ❌ Fan-out (Not allowed) |
| Foreign | Primary | ✅ Left |
| Foreign | Unique | ✅ Left |
| Foreign | Foreign | ❌ Fan-out (Not allowed) |
Пример
Следующий пример использует две семантические модели с общей сущностью и показывает запрос MetricFlow, который требует соединения между двумя семантическими моделями. Две семантические модели:
transactionsuser_signup
semantic_models:
- name: transactions
entities:
- name: id
type: primary
- name: user
type: foreign
expr: user_id
measures:
- name: average_purchase_price
agg: avg
expr: purchase_price
- name: user_signup
entities:
- name: user
type: primary
expr: user_id
dimensions:
- name: type
type: categorical
- MetricFlow использует
user_idв качестве ключа соединения для связывания двух семантических моделей,transactionsиuser_signup. Это позволяет вам запрашивать метрикуaverage_purchase_priceв семантической моделиtransactions, сгруппированную по измерениюtypeв семантической моделиuser_signup.- Обратите внимание, что мера
average_purchase_priceопределена вtransactions, гдеuser_idявляется внешней сущностью. Однако вuser_signupuser_idявляется основной сущностью.
- Обратите внимание, что мера
- Поскольку
user_idявляется внешним ключом вtransactionsи основным ключом вuser_signup, MetricFlow выполняет левое соединение, гдеtransactionsсоединяется сuser_signup, чтобы получить доступ к мереaverage_purchase_price, определенной вtransactions. - Чтобы запрашивать измерения из разных семантических моделей, добавьте двойное подчеркивание (или dunder) к имени измерения после соединения сущности в вашем инструменте редактирования. Следующий запрос,
user_id__type, включен в качестве измерения с использованием флага--group-by(typeявляется измерением).
dbt sl query --metrics average_purchase_price --group-by metric_time,user_id__type # В dbt Cloud
mf query --metrics average_purchase_price --group-by metric_time,user_id__type # В dbt Core
Мульти-хоп соединения
MetricFlow позволяет пользователям соединять меры и измерения через граф сущностей, переходя от одной таблицы к другой в графе. Это называется "мульти-хоп соединение".
MetricFlow может соединять до трех таблиц, поддерживая мульти-хоп соединения с ограничением в два хопа. Это позволяет:
- Выполнять сложный анализ данных без неоднозначных путей.
- Поддерживать навигацию через модели данных, например, переход от
ordersкcustomersи кcountryтаблицам.
Хотя прямые треххоповые пути ограничены, чтобы предотвратить путаницу из-за множества маршрутов к одним и тем же данным, MetricFlow позволяет соединять более трех таблиц, если соединения не превышают двух хопов для достижения измерения.
Например, если у вас есть две модели, country и region, где клиенты связаны с странами, которые, в свою очередь, связаны с регионами, вы можете соединить их все в одном SQL-запросе и анализировать orders по customer__country_country_name, но не по customer__country__region_name.

Обратите внимание, как схема может быть переведена в следующие три семантические модели MetricFlow для создания метрики 'Средняя цена покупки по странам', используя меру purchase_price из таблицы продаж и измерение country_name из таблицы country_dim.
semantic_models:
- name: sales
defaults:
agg_time_dimension: first_ordered_at
entities:
- name: id
type: primary
- name: user_id
type: foreign
measures:
- name: average_purchase_price
agg: avg
expr: purchase_price
dimensions:
- name: metric_time
type: time
type_params:
- name: user_signup
entities:
- name: user_id
type: primary
- name: country_id
type: unique
dimensions:
- name: signup_date
type: time
- name: country_dim
- name: country
entities:
- name: country_id
type: primary
dimensions:
- name: country_name
type: categorical
Запрос мульти-хоп соединений
Чтобы запрашивать измерения без участия мульти-хоп соединения, вы можете использовать полностью квалифицированное имя измерения с синтаксисом сущность двойное подчеркивание (dunder) измерение, например, entity__dimension.
Для измерений, полученных с помощью мульти-хоп соединения, вам нужно дополнительно указать путь сущности в виде списка, например, user_id.