The Jerusalem PostAustralian lawmaker Helen Haines in critical condition after vehicle ramming attackPunchUCL: PSG face Barcelona, Bayern host Arsenal in matchweek three, other fixturesESPNA week removed from embarrassing tie, where do Commanders go from here?Inquirer‘Magnificent Seven’ pioneers reunite for historic PMA installationUN NewsProtecting Earth’s fragile biodiversity takes spotlight at Armenia talksBollywood HungamaImran Khan’s plea against ‘Leave India’ notice to be heard on October 26; Bombay High Court seeks Maharashtra government’s inclusionRTP DesportoJaime Faria sobe a 56.º do ranking mundial de ténisESPN CricinfoPowar appointed men's national selector; Ojha to serve as chairZDF heuteEntdecken Sie das ZDF-NachrichtenstudioPremium TimesBenue Catholic school relocates students over security concernsBellaNaijaSeven Women, Seven Innovations: InnovateNaija’s Role in Nigeria’s Tech StoryIl Fatto Quotidiano“Gli stranieri in Italia danno molto e ricevono poco”: il rapporto Migrantes sui confini che restano “ben oltre le frontiere”
The Daily Newsstand · Free, Always
Monday, October 19, 2026

От SQL-запроса до результата — в одном окне. Обзор на dbt-модуль в SubQuery

Translate

Привет! Меня зовут Маргарита, я 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 строк. Для проверки запроса этого хватает, но при необходимости количество строк можно увеличить до 1000 через настройки 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, облачную платформу или свою связку из нескольких инструментов?

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.