Фильтрация DBT для (отсутствует) при запуске на инкрементной модели

# #sql #google-bigquery #dbt

Вопрос:

Я пытаюсь настроить модель DBT как materialized='incremental' , но это не удается, так как DBT, похоже, оборачивает мою модель проверкой, из-за (None) or (None) is null которой модель выдает исключение SQL для целевого объекта (Bigquery). (None) Проверки, похоже, не добавляются для неинкрементных моделей или при запуске, с --full-refresh помощью которых просто заново создается таблица.

Согласно документам, инкрементные модели должны быть упакованы следующим образом:

 merge into {{ destination_table }} DEST
using ({{ model_sql }}) SRC
...
 

Однако то, что я вижу, это:

 merge into {{ destination_table }} DEST
using ( select * from( {{ model_sql }} ) where (None) or (None) is null) SRC
...
 

Мне не ясно, откуда (None) берется проверка, чего она на самом деле пытается достичь, обернув запрос, и какую (если таковая имеется) конфигурацию модели нужно было бы настроить, чтобы исправить это.

Конфигурация моей модели установлена как {{ config(materialized='incremental', alias='some_name') }} , и я попытался также установить unique_key ее на всякий случай, но безуспешно.

Я запускаю модель с dbt run --profiles-dir dbt_profiles --models ${MODEL} --target development и могу подтвердить , что скомпилированная модель в порядке, и (None) проверки добавляются для запуска модели.

Я запускаю dbt 0.11.1 (старую версию репо).

Любая помощь будет весьма признательна!

Комментарии:

1. К сожалению, документы, на которые вы ссылаетесь, относятся к текущим версиям dbt (0.21.0), поэтому вы отстаете на 10 версий! С тех пор произошло много изменений, особенно для BQ. У вас есть a partition_by в конфигурации и a {% if is_incremental() %} в модели? Возможно, было бы более полезно опубликовать как можно больше кода, специфичного для dbt (изменение любого конфиденциального кода).

2. Ваш комментарий побудил меня покопаться в 0.11 источнике и найти ответ, опубликованный ниже. Спасибо!

Ответ №1:

Удалось решить эту проблему, изучив кодовую базу DBT на github для моей целевой версии — инкрементный макрос 0.11

Похоже, что в 0.11 DBT ожидает sql_where , что будет установлен флаг конфигурации, который используется для выбора записей, которые вы хотите использовать для инкрементной загрузки (предварительно наведите курсор на is_incremental() макрос).

В моем случае, поскольку я просто хочу загружать все строки при каждом инкрементном запуске и помечать их меткой времени загрузки, установка sql_where='TRUE' создает допустимое продолжение и не фильтрует мои результаты (т. Е. WHERE TRUE OR TRUE IS NULL )

Ответ №2:

была ли у вас заранее настроена инкрементная модель с 0.11.1 помощью ? Я почти уверен, что вам нужно использовать {{ this }} , но, возможно, в версии этого не существовало 0.11.1 . документы по this