# #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