
Привет! Сегодня речь пойдет о семантическом слое метрик. В публикации рассмотрим на практике грани интересной темы:
Что такое семантический слой, и в чем разница между Метрикой и Витриной данных.
Пути формирования метрик: SQL (ad-hoc), UI, dbt Metrics, Cube.
Примеры декларативной конфигурации в YAML и использования метрик.
На что обращать внимание при выборе решения: Стек технологий, Доступность vs. Выразительнось, Гибкость vs. Скорость.
Метрика - это нечто измеримое, представляющее интерес

Чем метрика отличается от витрины данных?
Витрины данных - это статичные таблицы

Витрины данных - основной результаты шага преобразования данных (T из ELT)
Витрины данных создаются для того, чтобы сделать расчет метрик понятным и простым
Метрики, в отличие от Витрин, имеют динамический характер: функция агрегации / гранулярность даты / набор измерений / применяемые фильтры

Как можно получить метрики?
Написание SQL-запросов к Витринам данных

С первого взгляда, простой способ, который однако очень просто может превратиться в сложночитаемый код
Требуются навыки SQL, часто - продвинутые: CTE, window functions, CASE expressions
В основном ad-hoc - ответ здесь и сейчас на конкретный вопрос. Новый вопрос - новый SQL-код
User Interface BI-инструментов

Простой и интуитивно понятный способ конфигурации метрик
Используется в большинстве BI-решений
Специальные языки, связанные с BI-инструментами (LookML)

Широкие возможности конфигурирования
Но привязка к конкретному решению (Vendor lock-in)
Семантический слой (Semantic Layer)

Прослойка между СУБД и бизнес-пользователями
Централизация бизнес-логики — определение метрик (декларативно) в одном месте
Разделение аналитического бэкенда и потребителей
Продвинутые паттерны моделирования (dimensions, segments, joins, drill-downs)
Обращение через API из множества инструментов: BI, Notebooks, REST, Embedded analytics
Использование dbt Metrics
dbt Metrics - семантический слой формирования метрик от dbt Labs.
Для использования потребуется установить модуль dbt-labs/metrics
packages: - package: dbt-labs/metrics version: [">=1.0.0", "<2.0.0"]
Метрики задаются декларативно в YAML файле
version: 2 metrics: - name: costs label: 'Costs spent (RUB)' model: ref('f_tracker') description: '' calculation_method: sum expression: cost timestamp: dt time_grains: [day, week, month, quarter, year] dimensions: [traffic_grouping, traffic_source, traffic_medium, traffic_campaign, device_category, location_country] - name: clicks label: 'Clicks' model: ref('f_tracker') description: '' calculation_method: sum expression: clicks timestamp: dt time_grains: [day, week, month, quarter, year] dimensions: [traffic_grouping, traffic_source, traffic_medium, traffic_campaign, device_category, location_country] - name: cpc label: 'Cost per Click' description: '' calculation_method: derived expression: "{{ metric('costs') }} / {{ metric('clicks') }}" timestamp: dt time_grains: [day, week, month, quarter, year] dimensions: [traffic_grouping, traffic_source, traffic_medium, traffic_campaign, device_category, location_country]
Описав метрику, вы можете обращаться к ней из других моделей dbt
{{ config ( materialized='table' ) }} select * from {{ metrics.calculate( metric_list=[metric('costs')] , grain='month' , dimensions=['traffic_source'] , date_alias='reporting_date' ) }}
Использование Cube
Cube - инструмент формирования семантического слоя со множеством возможностей.
Развернуть инструмент можно через Docker.
version: '2' services: cube: image: cubejs/cube:latest ports: - 4000:4000 - 15432:15432 env_file: - .env volumes: - .:/cube/conf
Метрики задаются декларативно в формате YAML или JS
cubes: - name: f_tracker sql: SELECT * FROM analytics.f_tracker measures: - name: costs sql: cost type: sum - name: clicks sql: clicks type: sum - name: CPC sql: '{CUBE.costs} / nullif(coalesce({CUBE.clicks}, 1), 0)' type: number dimensions: - name: date sql: 'dt' type: time - name: traffic_grouping sql: traffic_grouping type: string - name: traffic_source sql: traffic_source type: string - name: traffic_medium sql: traffic_medium type: string - name: traffic_campaign sql: traffic_campaign type: string - name: device_category sql: device_category type: string - name: location_country sql: location_country type: string dataSource: default
Для запроса метрик доступны несколько интерфейсов:
SQL API
REST API
GraphQL API

Сценарии использования
Материализация метрик в отдельные таблицы.
Когда это выгодно?
Предположим, у вас много метрик (KPI): 15+
Есть заранее известный набор измерений/фильтров
Большие/дорогие таблицы для частых запросов
Вы можете предварительно агрегировать данные
Технически, это dbt-модели со ссылками на метрики
Звучит как старый добрый OLAP-куб
Динамические запросы метрик через Сервер метрик
Основной способ использования Семантического слоя.

Необходимо иметь Сервер, который будет коммуницировать запрос метрик в понятные СУБД скрипты и отдавать результаты
Интерактивная аналитика (например, через BI-инструмент)
На что обращать внимание при выборе решения
Стек технологий, на котором построено ваше решение
Прежде всего, попробуй ответить на вопрос: Какую проблему вы пытаетесь решить? Для чего вам необходим семантический слой?
Далее пройдите по списку вопросов:
Используете ли вы dbt? (низкий порог входа в dbt Metics)
Какой инструмент BI вы используете? (Looker уже имеет это всё)
Предпочтительно ли для вас использование Open Source Software? (прозрачность, доработка кода под себя)
Можете ли вы развернуть решение на своей инфраструктуре? (Или хотите SaaS)
Например, сейчас использование dbt Cloud Proxy Server доступно только для пользователей Snowflake и dbt Cloud.

Компромисс между гибкостью и скоростью
Кэширование - отличный паттерн. При предварительной агрегации (кэшировании) вы экономите время и ресурсы (деньги). Но при всех его преимуществах, он также вносит ряд усложнений:
Вы не можете предагрегировать все возможные варианты ответов (либо это будет дорого)
Кэш имеет свойство протухать со временем (исходные данные меняются)
Лучшей практикой является кэширование наиболее часто используемых запросов метрик.
Cube поддерживает предварительную агрегацию
dbt Metrics - нет, однако вы можете использовать dbt Metrics для материализации в моделях (аналог OLAP-куба)
Доступность против Выразительности
Главная особенность dbt Metrics на текущий момент - отсутствие понятния связи таблиц (foreign key). Зато конифгурация и использование таких метрик выглядит проще для неискушенного пользователя.
Cube (как и LookML) оперирует абстракциями SQL: таблицы, соединения.
dbt Metrics делает ставку на бизнес-сущности.
Что еще изучить по теме?
Приходите учиться использовать самые современные, популярные, востребованные инструменты на курсе Analytics Engineer:
Extract - Load - Transform
dbt: from basics to advanced
Deployment, Continuous Integration, Monitoring
Business Intelligence
DWH Advanced toolkit
Полезные материалы:

