Как построить семантический слой по частям: пошаговое руководство для занятых инженеров-аналитиков
Семантический слой dbt основан на идее, что преобразование данных должно быть как гибким, позволяя выполнять агрегации на лету, сгруппированные и отфильтрованные по определяемым измерениям, так и контролируемым по версиям и тестируемым. Как и в любой другой кодовой базе, вы должны быть уверены, что ваши преобразования правильно выражают бизнес-логику вашей организации. Исторически сложилось так, что вам приходилось выбирать между этими опциями, но семантический слой dbt объединяет их. Однако это потребовало новых парадигм для того, как вы выражаете свои преобразования.
Из-за этого мы заметили, что пользователи dbt хотят принять семантический слой, но их пугает идея миграции их преобразований в эту новую парадигму. Хорошая новость заключается в том, что вам не нужно делать ог ромную одноразовую миграцию.
Мы здесь, чтобы обсудить другой способ: построение семантического слоя по частям. Наша цель — убедиться, что вы получаете больше рычагов и скорости на каждом этапе вашего пути. Если вы хотите начать строить, но у вас ограниченные ресурсы (как у большинства занятых инженеров-аналитиков), это особенно для вас.
Система существительного: решение, что происходит где
Когда вы используете семантический слой dbt, вы хотите минимизировать моделирование, которое существует вне dbt. Полностью устраните его, если можете. Почему?
- Это дублирующее, фрагментарное и запутанное, как обсуждалось выше.
- Это менее мощное.
- Вы не можете тестировать его.
- В зависимости от инструмента, часто вы не м ожете контролировать версии.
Вам нужен единый поток разработки, который обрабатывает нормализованное преобразование в моделях dbt и динамическую денормализацию в семантическом слое dbt (что означает, что он динамически комбинирует и преобразует нормализованные модели данных в различные форматы, когда вам это нужно).
🏎️ Семантический слой — это движок денормализации. dbt преобразует ваши данные в чистые, нормализованные хранилища. Семантический слой dbt — это движок денормализации, который динамически соединяет и формирует эти строительные блоки в максимальное количество форм динамически.
Это позволяет создать более гибкий слой потребления, что означает, что инструменты нижнего уровня (такие как AI или панели управления) могут располагаться как можно ближе к артефактам и API, созданным семантическим слоем, и сосредоточиться на том, что делает их уникальными, вместо того чтобы быть обремененными базовыми задачами динамического моделирования и агрегации. Любые конструкты, специфичные для инструмента, обычно должны работать как можно ближе к прозрачным проходам, в основном служа для отображения метрик и измерений из семантического слоя в вашем инструменте нижнего уровня. Конечно, могут быть исключения, но в качестве общего руководящего принципа это дает вам максимальную способность к динамической денормализации, и, следовательно, ценность, от вашего кода семантического слоя.
Теперь, когда мы установили систему, давайте углубимся в план того, как мы можем достичь этого итеративно.
План: к итеративной скорости
-
Определите продукт данных, который имеет влияние Найдите что-то, что активно используется и имеет в ысокую ценность, но имеет довольно узкий охват. Не начинайте с широкой исполнительной панели, которая показывает метрики по всей компании, потому что вы стремитесь оптимизировать миграцию наименьшего объема моделирования для наибольшего влияния, которое вы можете.
Например, хорошим началом будет панель, сосредоточенная на стоимости привлечения клиентов (CAC), которая опирается на узкий набор метрик и базовых таблиц, которые, тем не менее, критически важны для вашей компании.
-
Каталогизируйте модели и их столбцы, которые обслуживают продукт данных, как в dbt, так и в инструменте BI, включая сводки, таблицы метрик и хранилища, которые их поддерживают. Обратите особое внимание на агрегации, так как они будут составлять метрики. Вы можете обратиться к этому примеру Google Sheet для одного из способов отслеживания этого.
-
Растопите замороженные сводки в вашем проекте dbt, а также вариации, смоделированные в вашем инструменте BI, в код семантического слоя. Мы углубимся в этот процесс, и мы рекомендуем вам прочитать больше об этой тактической терминологии (замороженные, сводка и т.д.) по ссылке — она будет использоваться на протяжении всей этой статьи!
-
Создайте параллельную версию вашего продукта данных, которая указывает на артефакты семантического слоя, проведите аудит, а затем опубликуйте. Создание в параллели снимает давление, позволяя вам исправить любые проблемы и опубликовать их плавно. Вы сохраните существующий продукт данных как есть, заменяя клон, чтобы он снабжался данными из семантического слоя.
Эти шаги составляют итеративный элемент, который вы будете отправлять, по мере того как вы постепенно перемещаете код в ваш семантический слой. По мере того как мы углубляемся в то, как это сделать, мы обсудим немедленную ценность, которую это предоставляет вашей команде и заинтересованным сторонам. В целом, это позволяет вам значительно увеличить скорость итерации.
Процесс плавления статических, замороженных таблиц в более гибкий, текучий, динамический код семантического слоя не сложен, но полезно углубиться в конкретные шаги процесса. В следующем разделе мы погрузимся в то, как это выглядит на практике, чтобы у вас было четкое понимание "что требуется".
Это самый технический, детализированный и специфичный раздел этой статьи, поэтому обязательно добавьте его в закладки и обращайтесь к нему как можно чаще, пока процесс не станет таким же интуитивным, как обычное моделирование в dbt!
Миграция части: пошаговое руководство
1. Определите цель
- Определите относительно нормализованное хранилище, которое обеспечивает сводки в dbt. Если вы делаете сводки в вашем инструменте BI, начните с этого. Но мы рекомендуем начинать с замороженных таблиц в dbt сначала и постепенно проходить через поток DAG, включая логику в вашем инструменте BI в последнюю очередь. Это потому, что мы хотим итеративно разбивать эти замороженные концепции таким образом, чтобы мы получали выгоду от более ранних частей цепочки, которые уже были мигрированы. Думайте о "движении слева направо в большом DAG", который охватывает все ваши инструменты.
- ✅
orders
,customers
— это базовые концепции, поддерживающие ваш бизнес, поэтому они должны быть моделями хранилищ, материализованными через dbt. - ❌
active_accounts_per_week
— это построено на основе вышеуказанного, и то, что мы хотим генерировать динамически в семантическом слое dbt. - Другими словами:
customers
иorders
— это нормализованные строительные блоки,active_accounts_per_week
— это сводка, и мы всегда хотим мигрировать их в семантический слой.
- ✅
2. Каталогизируйте входные данные
- Определите нормализованные стол бцы и игнорируйте любые столбцы агрегации на данный момент. Например,
order_id
,ordered_at
,customer_id
,order_total
— это поля, которые мы хотим поместить в нашу семантическую модель, оконная функция, которая суммируетcustomer_cac
статически в модели dbt, не является полем, которое мы хотим в нашей семантической модели, потому что мы хотим динамически закодировать это вычисление как метрику в семантическом слое.- Если вы обнаружите на следующем шаге, что не можете выразить определенное вычисление в семантическом слое, используйте dbt для его моделирования**.** Это красота интеграции вашего кода семантического слоя в вашу кодовую базу dbt, это легко управлять перемещением линии между слоями преобразования и семантическим, потому что вы управляете единой кодовой и инструментальной базой.
3. Напишите код семантического слоя
- Начните с семантической модели, проходя по столбцам и помещая все идентифицированные столбцы из Шага 2 в 3 семантических категории:
- Сущности — это основа ваших семантических концепций или объектов, вы можете думать о них как о ключах или идентификаторах, которые формируют зерно.
- Измерения — это способы группировки и классификации этих объектов или концепций, такие как время и категории.
- Меры — это числовые значения, которые вы хотите агрегировать, такие как общая сумма заказа или количество раз, когда пользователь кликнул на рекламу.
- Создайте метрики для столбцов агрегации, которые мы не закодировали в семантической модели.
- Теперь, определите сводку, которую вы хотите растопить. Обратитесь к предыдущему примеру, чтобы помочь различить эти типы моделей.
- Повторите эти шаги для любых других концепций, которые вам нужно создать для этой сводки, например,
active_accounts_per_week
может потребовать какcustomers
, так иorders
. - Создайте метрики для столбцов агрегации, присутствующих в сводке. Если ваша сводка ссылается на несколько моделей, поместите метрики в YAML-файл, который наиболее тесно связан с зерном или ключевой агрегацией таблицы. Например,
active_accounts_per_week
агрегируется на недельном временном зерне, но ключевая метрика считает учетные записи клиентов, поэтому мы хотели бы поместить эту метрику в файлcustomers.yml
илиsem_customers.yml
(в зависимости от системы именования, которую вы предпочитаете). Если она также содержит метрику, агрегирующую общие заказы за данную неделю, мы поместим эту метрику вorders.yml
илиsem_orders.yml
. - Создайте сохраненные запросы с экспортами, настроенные для материализации ваших новых артефактов на основе семантического слоя в хранилище параллельно с замороженной сводкой. Это позволит нам переключить инструменты потребления и провести аудит результатов.