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

Joins

Соединения являются мощной частью MetricFlow и упрощают процесс предоставления всех доступных измерений для ваших метрик во время выполнения запроса, независимо от того, где они определены в различных семантических моделях. С помощью соединений вы также можете создавать метрики, используя меры из разных семантических моделей.

Соединения используют entities, определенные в конфигурациях вашей семантической модели, в качестве ключей соединения между таблицами. Предполагая, что сущности определены в семантической модели, MetricFlow создает граф, используя семантические модели в качестве узлов и пути соединения в качестве ребер для автоматического выполнения соединений. MetricFlow выбирает подходящий тип соединения и избегает фан-аут или хазм соединений с другими таблицами на основе типов сущностей.

Что такое фан-аут или хазм соединения?
— Фан-аут соединения возникают, когда одна строка в таблице соединяется с несколькими строками в другой таблице, что приводит к большему количеству выходных строк, чем входных.

— Хазм соединения возникают, когда две таблицы имеют отношение многие ко многим через промежуточную таблицу, и соединение приводит к дублированию или отсутствию данных.

Типы соединений

Соединения генерируются автоматически

MetricFlow автоматически генерирует необходимые соединения с определенными семантическими объектами, устраняя необходимость создания новых семантических моделей или конфигурационных файлов.

Этот документ объясняет различные типы соединений, которые могут быть использованы с сущностями, и как их запрашивать с помощью CLI.

MetricFlow в основном использует левые соединения и ограничивает использование фан-аут и хазм соединений. Обратитесь к таблице ниже, чтобы определить, какие соединения разрешены или не разрешены на основе конкретных типов сущностей, чтобы предотвратить создание рискованных соединений.

entity type - Table Aentity type - Table BJoin type
PrimaryPrimary✅ Left
PrimaryUnique✅ Left
PrimaryForeign❌ Fan-out (Not allowed)
UniquePrimary✅ Left
UniqueUnique✅ Left
UniqueForeign❌ Fan-out (Not allowed)
ForeignPrimary✅ Left
ForeignUnique✅ Left
ForeignForeign❌ 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.

Multi-Hop-Join

Обратите внимание, как схема может быть переведена в следующие три семантические модели 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.

0