Resumo
bd.Table.create() (pacote basedosdados, usado por upload_to_gcs/pelo fluxo de materialização) registra a tabela externa do BigQuery — o "ponteiro" que permite fazer SELECT sobre os arquivos no GCS — sempre dentro de um projeto fixo, gcloud-projects.staging.name (~/.basedosdados/config.toml), que no ambiente real é basedosdados-staging. Não existe parâmetro em Table()/bucket_name/billing_project_id que mude esse destino.
O problema: a macro dbt set_datalake_project (macros/set_datalake_project.sql) resolve o projeto consultado de forma diferente por target:
target=dev → basedosdados-dev
target=prod → basedosdados-staging
Ou seja, qualquer flow que rode dbt run/test com target=dev (como o mat_test_flow da #1867, que roda dev antes de prod) espera achar a tabela externa em basedosdados-dev — mas bd.Table.create() só a cria em basedosdados-staging. Sem uma segunda cópia manual do ponteiro em basedosdados-dev (mesmo schema, mesma config de particionamento Hive quando aplicável), o dbt run --target dev falha por tabela não encontrada.
Por que abrir agora
Achado durante o teste de ponta a ponta da #1867 (pipeline orientado a eventos) com um piloto novo (test_dataset.test_event_pipeline_partitioned). Foi o mais difícil de diagnosticar entre os problemas encontrados nesse teste: o piloto original (test_event_pipeline) já dependia dessa segunda cópia manual — criada em algum momento anterior da sessão, sem virar código nem documentação — então o gap ficou invisível até faltar de novo num piloto novo.
Qualquer dataset novo que siga esse fluxo (upload_to_gcs → dbt run --target dev) bate na mesma parede, sem aviso — o erro só aparece como "tabela não encontrada" em tempo de execução do dbt, sem apontar pra causa real.
Proposta
Duas alternativas, a decidir por quem tem mais contexto de por que a separação staging/dev existe:
upload_to_gcs/Table.create() (ou um wrapper em pipelines/utils/) passa a criar as duas cópias do ponteiro externo automaticamente (basedosdados-staging e basedosdados-dev), sempre que aplicável — inclusive replicando HivePartitioningOptions quando o dado é particionado.
- Ou o pipeline deveria depender de só uma das duas cópias — revisitar por que a macro dbt resolve
target=dev pra um projeto diferente de onde o dado é de fato registrado, e alinhar os dois.
Não decidido aqui qual caminho é o certo — abrindo pra registrar o gap e discutir.
Achado durante
#1867 (pipeline orientado a eventos), piloto test_event_pipeline_partitioned. PR #1932.
Resumo
bd.Table.create()(pacotebasedosdados, usado porupload_to_gcs/pelo fluxo de materialização) registra a tabela externa do BigQuery — o "ponteiro" que permite fazerSELECTsobre os arquivos no GCS — sempre dentro de um projeto fixo,gcloud-projects.staging.name(~/.basedosdados/config.toml), que no ambiente real ébasedosdados-staging. Não existe parâmetro emTable()/bucket_name/billing_project_idque mude esse destino.O problema: a macro dbt
set_datalake_project(macros/set_datalake_project.sql) resolve o projeto consultado de forma diferente por target:Ou seja, qualquer flow que rode
dbt run/testcomtarget=dev(como omat_test_flowda #1867, que roda dev antes de prod) espera achar a tabela externa embasedosdados-dev— masbd.Table.create()só a cria embasedosdados-staging. Sem uma segunda cópia manual do ponteiro embasedosdados-dev(mesmo schema, mesma config de particionamento Hive quando aplicável), odbt run --target devfalha por tabela não encontrada.Por que abrir agora
Achado durante o teste de ponta a ponta da #1867 (pipeline orientado a eventos) com um piloto novo (
test_dataset.test_event_pipeline_partitioned). Foi o mais difícil de diagnosticar entre os problemas encontrados nesse teste: o piloto original (test_event_pipeline) já dependia dessa segunda cópia manual — criada em algum momento anterior da sessão, sem virar código nem documentação — então o gap ficou invisível até faltar de novo num piloto novo.Qualquer dataset novo que siga esse fluxo (
upload_to_gcs→dbt run --target dev) bate na mesma parede, sem aviso — o erro só aparece como "tabela não encontrada" em tempo de execução do dbt, sem apontar pra causa real.Proposta
Duas alternativas, a decidir por quem tem mais contexto de por que a separação staging/dev existe:
upload_to_gcs/Table.create()(ou um wrapper empipelines/utils/) passa a criar as duas cópias do ponteiro externo automaticamente (basedosdados-stagingebasedosdados-dev), sempre que aplicável — inclusive replicandoHivePartitioningOptionsquando o dado é particionado.target=devpra um projeto diferente de onde o dado é de fato registrado, e alinhar os dois.Não decidido aqui qual caminho é o certo — abrindo pra registrar o gap e discutir.
Achado durante
#1867 (pipeline orientado a eventos), piloto
test_event_pipeline_partitioned. PR #1932.