Перейти к основному содержимому

Пользовательская стратегия микропакетной обработки

Удалён в v2

Этот флаг удалён в v2. Новое поведение включено всегда. При обновлении удалите этот флаг из dbt_project.yml.

require_batched_execution_for_custom_microbatch_strategydbt Последняя версия v1dbt v1
Введён2024.111.9.0
Стал стандартным (по умолчанию → true)2026.091.12.0
Удалён—v2.0

Флаг require_batched_execution_for_custom_microbatch_strategy имеет значение только в том случае, если в вашем проекте уже есть пользовательский макрос get_incremental_microbatch_sql. Если пользовательского макроса микропакетной обработки нет, задавать этот флаг не нужно — dbt автоматически выполняет микропакетную обработку для любой модели, использующей стратегию микропакетной обработки.

Начиная с dbt v1.12, значение этого флага по умолчанию — true: dbt выполняет пользовательские стратегии микропакетной обработки пакетами. Если у вас есть пользовательский макрос микропакетной обработки и флаг установлен в false, dbt выдаёт предупреждение об устаревшем поведении.

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

Влияние​

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

Если вы переопределили get_incremental_microbatch_sql — обычно для обхода ограничений адаптера или реализации пользовательской стратегии партиционирования, — ваш макрос вызывается в режиме пакетного выполнения, на который он изначально не был рассчитан. Возможные последствия:

  • Макрос игнорирует более узкое окно event_time_start / event_time_end и повторно обрабатывает весь диапазон для каждого пакета, что приводит к лишним вычислениям, дублированию строк или конфликтам MERGE/INSERT.
  • Макрос завершается с ошибкой, поскольку рассчитан на однократный вызов за запуск.
  • Количество строк в целевой таблице различается в зависимости от значения флага.
 Рекомендуемые действия

Если модель микропакетной обработки завершается с ошибкой в ходе выполнения, создаёт дублирующиеся строки или конфликты MERGE/INSERT либо повторно обрабатывает весь диапазон дат для каждого пакета, проверьте, фильтрует ли макрос get_incremental_microbatch_sql данные по окну event_time_start / event_time_end. Если он использует жёстко заданный фильтр по дате (например, where event_ts >= current_date - interval '1 day') или считывает только _dbt_max_partition, макрос игнорирует окно отдельного пакета и повторно обрабатывает весь диапазон на каждой итерации.

Чтобы исправить это, перепишите макрос так, чтобы он использовал окно отдельного пакета:

{% macro get_incremental_microbatch_sql(arg_dict) %}
{%- set target = arg_dict["target_relation"] -%}
{%- set source = arg_dict["temp_relation"] -%}
{%- set event_time = arg_dict["incremental_predicates"] -%}

-- Используйте окно отдельного пакета, которое dbt передаёт через event_time_start/event_time_end
-- (доступно через arg_dict["incremental_predicates"] или model.config.event_time_*),
-- А НЕ жёстко заданный фильтр по дате.
insert into {{ target }}
select * from {{ source }}
{% endmacro %}

Для проверки выполните dbt run --event-time-start <date> --event-time-end <date> -s <model> для одного пакета и убедитесь, что количество строк соответствует данным за этот день.

Чтобы отключить это поведение, установите флаг в false:

dbt_project.yml
flags:
require_batched_execution_for_custom_microbatch_strategy: false

Нашли ошибку?

0
Loading