О микропакетных инкрементальных моделях beta
Новая стратегия microbatch
доступна в бета-версии для dbt Cloud "Latest" и dbt Core v1.9.
Если вы используете пользовательский макрос microbatch, установите флаг изменения поведения в вашем dbt_project.yml
, чтобы включить пакетное выполнение. Если у вас нет пользовательского макроса microbatch, вам не нужно устанавливать этот флаг, так как dbt автоматически обработает микропакетирование для любой модели, использующей стратегию microbatch.
Читайте и участвуйте в обсуждении: dbt-core#10672
Обратитесь к Поддерживаемые инкрементальные стратегии по адаптеру для списка поддерживаемых адаптеров.
Что такое "microbatch" в dbt?
Инкрементальные модели в dbt — это материализация, предназначенная для эффективного обновления таблиц вашего хранилища данных путем трансформации и загрузки новых или измененных данных с момента последнего запуска. Вместо повторной обработки всего набора данных каждый раз, инкрементальные модели обрабатывают меньшее количество строк, а затем добавляют, обновляют или заменяют эти строки в существующей таблице. Это может значительно сократить время и ресурсы, необходимые для ваших преобразований данных.
Microbatch — это инкрементальная стратегия, разработанная для больших временных рядов данных:
-
Она полагается исключительно на временную колонку (
event_time
) для определения временных диапазонов для фильтрации. Установите колонкуevent_time
для вашей модели microbatch и ее прямых родителей (входящих моделей). Обратите внимание, что это отличается отpartition_by
, который группирует строки в разделы. -
Она дополняет, а не заменяет существующие инкрементальные стратегии, сосредотачиваясь на эффективности и простоте пакетной обработки.
-
В отличие от традиционных инкрементальных стратегий, microbatch позволяет перепроцессировать неудачные пакеты, автоматически обнаруживать параллельное выполнение пакетов и устранять необходимость в сложной условной логике для заполнения пропусков.
-
Обратите внимание, что microbatch может не быть лучшей стратегией для всех случаев использования. Рассмотрите другие стратегии для случаев, таких как отсутствие надежной колонки
event_time
или если вы хотите больше контроля над инкрементальной логикой. Подробнее читайте в Какmicrobatch
сравнивается с другими инкрементальными стратегиями.
Как работает microbatch
Когда dbt запускает модель microbatch — будь то в первый раз, во время инкрементальных запусков или в указанных заполнениях пропусков — он разделит обработку на несколько запросов (или "пакетов"), основываясь на event_time
и batch_size
, которые вы настроили.
Каждый "пакет" соответствует одному ограниченному временному периоду (по умолчанию, один день данных). В то время как другие инкрементальные стратегии работают только с "старыми" и "новыми" данными, модели microbatch рассматривают каждый пакет как атомарную единицу, которую можно построить или заменить самостоятельно. Каждый пакет независим и .
Это мощная абстракция, которая позволяет dbt запускать пакеты отдельно, одновременно и повторно их независимо.
Пример
Модель sessions
агрегирует и обогащает данные, поступающие из двух других моделей:
page_views
— это большая таблица временных рядов. Она содержит много строк, новые записи почти всегда поступают после существующих, и существующие записи редко обновляются. Она использует колонкуpage_view_start
в качествеevent_time
.customers
— это относительно небольшая размерная таблица. Атрибуты клиентов часто обновляются и не в временном порядке — то есть, старые клиенты с такой же вероятностью могут изменить значения колонок, как и новые клиенты. Модель customers не настраивает колонкуevent_time
.
В результате:
- Каждый пакет
sessions
будет фильтроватьpage_views
до эквивалентного временно ограниченного пакета. - Таблица
customers
не фильтруется, что приводит к полному сканированию для каждого пакета.
В дополнение к настройке event_time
для целевой таблицы, вы также должны указать его для любых входящих моделей, которые вы хотите фильтровать, даже если у них разные временные колонки.
models:
- name: page_views
config:
event_time: page_view_start
Мы запускаем модель sessions
для 1 октября 2024 года, а затем снова для 2 октября. Это приводит к следующим запросам:
- Model definition
- Compiled (Oct 1, 2024)
- Compiled (Oct 2, 2024)
event_time
для модели sessions
установлен на session_start
, который отмечает начало сеанса пользователя на сайте. Эта настройка позволяет dbt объединять несколько просмотров страниц (каждый из которых отслеживается своими собственными временными метками page_view_start
) в один сеанс. Таким образом, session_start
различает время отдельных просмотров страниц от более широкого временного интервала всего сеанса пользователя.
{{ config(
materialized='incremental',
incremental_strategy='microbatch',
event_time='session_start',
begin='2020-01-01',
batch_size='day'
) }}
with page_views as (
-- этот ref будет автоматически отфильтрован
select * from {{ ref('page_views') }}
),
customers as (
-- этот ref н е будет
select * from {{ ref('customers') }}
),
select
page_views.id as session_id,
page_views.page_view_start as session_start,
customers.*
from page_views
left join customers
on page_views.customer_id = customer.id
with page_views as (
select * from (
-- отфильтровано по настроенному event_time
select * from "analytics"."page_views"
where page_view_start >= '2024-10-01 00:00:00' -- 1 октября
and page_view_start < '2024-10-02 00:00:00'
)
),
customers as (
select * from "analytics"."customers"
),
...
with page_views as (
select * from (
-- отфильтровано по настроенному event_time
select * from "analytics"."page_views"
where page_view_start >= '2024-10-02 00:00:00' -- 2 октября
and page_view_start < '2024-10-03 00:00:00'
)
),
customers as (
select * from "analytics"."customers"
),
...
dbt даст указание платформе данных взять результат каждого пакетного запроса и вставить, обновить или заменить содержимое таблицы analytics.sessions
для того же дня данных. Для выполнения этой операции dbt использует наиболее эффективный атомарный механизм для "полной пакетной" замены, доступный на каждой платформе данных.
Не имеет значения, содержит ли таблица уже данные за этот день. При одинаковых входных данных результирующая таблица будет одинаковой, независимо от того, сколько раз пакет перепроцессируется.