Привет! Меня зовут Маргарита, я BI‑архитектор в Далее. Моя задача — чтобы клиенты получали подготовленные данные в удобном для них виде. В этом мне помогает dbt (Data Build Tool).

Раньше мы использовали локальную версию dbt, а с прошлого года перешли на внутреннюю веб‑платформу SubQuery. Теперь все задачи я делаю в одном окне, и на ту же работу уходит заметно меньше времени: по моим ощущениям, в 2–3 раза.

Возможно, этот обзор будет полезен коллегам, которые тоже работают с данными. Первое, к чему я быстро привыкла, — результат SQL‑запроса модели dbt можно посмотреть сразу в превью. Не нужно отдельно открывать СУБД и проверять данные на корректность выполненного SQL. С этого, пожалуй, и начну…

Если коротко, SubQuery — платформа для работы с большими данными. Здесь уже развернут dbt, есть SQL‑редактор, граф моделей, ветки, расписание и API, а еще — история изменений, логи запусков, ИИ‑генерация документации и многое другое. 

В этом обзоре я говорю только о dbt‑модуле, так как именно в нем провожу большую часть дня.

Сначала смотрю результат, потом сохраняю модель

Допустим, мне нужно собрать таблицу с заказами пользователей. Dbt‑модель может выглядеть так:

{{
    config(
        enabled= true,
        tags = ['orders'],
        unlogged = true,
        meta= {'owner': 'mgrtmark'},
        materialized= 'table',
        description = 'заказы'
    )
}}

select
    order_id,
    order_number,
    status,
    shipment_date,
    delivering_date
from {{ ref('orders') }}

Запрос можно выполнить целиком или выделить нужный фрагмент. Результат появится в превью: значения, названия колонок и типы данных. Там же можно отсортировать строки, закрепить столбец или скопировать названия полей в следующий запрос.

Раньше я отлаживала и оптимизировала запросы SQL в консоли СУБД, а потом переносила в локальный dbt. Сейчас делаю все в одном окне: и отладку, и запуск, и фикс ошибок — это очень удобно.

Редактор в dbt проекте можно настроить под себя: от шрифтов до автодополнения и подсказок.

Есть также поиск по проекту и переход к модели из ref() — что удобно, когда тебе нужно быстро перейти в источник\родительскую модель.

В результат запроса базово можно вывести до 200 строк. Для проверки запроса этого хватает, но при необходимости количество строк можно увеличить до 1 000 через настройки dbt.

Продакшн‑данные и данные для тестов и отладки у меня лежат отдельно в разных базах. В dbt для этого есть targets. Сначала работаю с запросом\моделью на stage, проверяю, прогоняю тесты. Когда результат меня устраивает, переключаюсь на prod и запускаю уже там. 

В SubQuery нужный target выбирается в верхней панели. В локальном проекте те же подключения настраиваются через profiles.yml и выбором флага при запуске. Сама логика знакомая, поэтому переучиваться не пришлось. В SubQuery достаточно выбрать target в панели (это просто и безопасно), а не каждый раз думать о том, чтобы не забыть дописать параметр в команду в терминале.

Запросы мы меняем в отдельных ветках

Плюс в том, что мы с коллегой можем работать над одной моделью: каждый в своей рабочей области, над своим участком. Перед тем как опубликовать модель, я подтягиваю изменения в свою раб. область из master‑ветки, проверяю, какие изменения были сделаны в модели, и потом публикую. 

Если возникают конфликты, их можно легко разрешить в одном окне, написать комментарий, проверить на компиляцию. В master‑ветке можно посмотреть историю версий и понять: кто, как, когда и какие файлы менял.

Перед тем как данные попадают в прод, они проходят обязательное тестирование. Базовые тесты dbt уже встроены в SQ: их можно легко добавить прямо в документацию к модели. Есть и кастомные\специфичные тесты. Например: на наличие дублей в источнике, проверка источника на полноту данных, автогенерация запроса при изменении схемы таблицы и другие.

DAG (Directed Acyclic Graph) доступен в одном окне

Когда работаешь с финальной витриной, нужно понимать, какие модели готовят для нее данные (предки) и что зависит уже от нее (потомки).

В SubQuery граф открывается в панели вывода сразу под запросом: модели — узлы, связи — линии. По схеме понятны и состав цепочки, и направление зависимостей.

На графе можно выбрать конкретную модель, посмотреть ее предков и потомков, отфильтровать граф по названию или тегу. Для большого проекта это быстрее, чем разбирать зависимости по именам файлов.

Отсюда же запускается модель вместе с нужной частью графа. Например, можно пересчитать ее с предками или, наоборот, обновить все зависимые модели. Перед запуском видно, какая цепочка попадет в расчет.

В локальном dbt граф тоже был. Я смотрела его через dbt docs. Открывала отдельную страницу, находила модель и уже там разбиралась с зависимостями. В SubQuery код, результат запроса и граф находятся в одном окне.

Документацию к модели можно сгенерировать

Сервис подготовит описания модели и колонок, но их нужно проверить. Бизнес‑смысл иногда определяется неточно. Я использую генерацию как черновик, затем правлю формулировки при необходимости. Также можно посмотреть документацию на отдельной странице, найти модели по поиску, овнеру, наличию тестов, макросов и источников.

Обновление моделей запускаю по расписанию или по событию

Обычные расчеты я ставлю на расписание. В нем выбираются команда dbt и selector. Cron можно ввести вручную или собрать из полей с днями и временем. 

Ошибки приходят на почту, а результаты запусков сохраняются в истории. Для пересчета прошлого периода есть бэкфил: задаешь диапазон и шаг, например неделю.

Но источник не всегда обновляется в одно и то же время. У нас данные из источников в базу загружаются с помощью скриптов в Airflow. Сегодня скрипт закончит в 03:20, завтра — в 04:10. Если поставить dbt‑модель на фиксированное время, придется оставлять запас или рисковать запуском до окончания загрузки.

В таком сценарии я использую API SubQuery. В скрипте добавляется запрос с токеном, который дергает конкретную модель или тег, после чего пересчитывается нужный DAG. Это позволяет не гадать со временем обновления, так как нагрузка на базу может быть разной и нет риска остаться с неполными данными или вовсе без них.

Пример запуска по событию:

import requests


  requests.post(
    'https://subquery.ru/api/dbt/run',
    headers={
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ••••••••••••••••••••••••••••••••'  # Вместо точек вставляется токен
    },
    json={
        'projectId': '•••••••',   # Id проекта
        'branchId': '•••••••',    # Id ветки
        'command': 'RUN',         # Допустимые значения: RUN | RUN_OPERATION | TEST | SNAPSHOT | SEED | BUILD | COMPILE | SOURCE_FRESHNESS
        'model': 'my_first_dbt_model.sql'
    }
  )

Что еще есть для работы с данными

Я ограничилась dbt, чтобы обзор не превратился в справочник по всей платформе. Но у SubQuery есть еще несколько модулей, которые пригодятся аналитикам.

В файловом менеджере можно хранить данные на S3. Например, у меня там лежат словари, к которым я обращаюсь из запросов. Один такой справочник могут использовать несколько моделей, поэтому его не приходится дублировать внутри проекта.

В Python‑ноутбуках доступны ячейки Python, SQL, DuckDB и Markdown. К ним можно подключить СУБД, обработать файл, проверить гипотезу и вывести результат таблицей или графиком. Библиотеки устанавливаются из доступного каталога. 

В Ноутбуках можно как читать, так и писать данные в базу, а еще — создавать запросы к API. Это очень помогает при необходимости забора внешних данных для проведения различных исследований. 

Еще есть Потоки для загрузки исходных данных с площадок. Модуль пока развивается, поэтому здесь не буду разбирать его без отдельного рабочего примера.

Лайфхак — как в SubQuery не тратить лимит на запуски

Для индивидуальной работы с данными платформу можно использовать бесплатно. На стартовом тарифе доступны 5 участников команды, один редактор, один проект, один target и 100 dbt‑запусков в месяц. Запуск по расписанию тоже входит в лимит.

Чтобы не тратить лимит на отладку, я сначала проверяю запрос в SQL‑консоли. Запуски из нее не расходуют лимиты. В файл модели переношу уже собранный вариант.

Одна модель с обновлением по расписанию два раза в день израсходует около 60 в месяц. Для небольшого проекта одного аналитика 100 запусков хватит. 

Еще из приятного — все пошагово расписано в документации, а регистрация не через заявки, а прямо на сайте subquery.ru. Можно для начала просто зайти и позапускать модельки в демо‑проекте.

А что используете вы: локальный dbt, облачную платформу или свою связку из нескольких инструментов?

Комментарии (0)