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, который требует соединения между двумя семантическими моделями. Две семантические модели:
transactions
user_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_signup
user_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
.