
Привет! Сегодня речь пойдет о семантическом слое метрик. В публикации рассмотрим на практике грани интересной темы:
-
Что такое семантический слой, и в чем разница между Метрикой и Витриной данных.
-
Пути формирования метрик: 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
Полезные материалы:
ссылка на оригинал статьи https://habr.com/ru/articles/732066/
Добавить комментарий