Skip to content

fix(python-package): valida colunas ao adicionar dados em tabela existente - #1793

Open
aspeddro wants to merge 1 commit into
masterfrom
fix/table-create-validate-columns
Open

fix(python-package): valida colunas ao adicionar dados em tabela existente#1793
aspeddro wants to merge 1 commit into
masterfrom
fix/table-create-validate-columns

Conversation

@aspeddro

Copy link
Copy Markdown
Collaborator

Resumo

Ao usar Table.create para atualizar os dados de uma tabela que já existe (por exemplo, enviando uma nova partição como ano=2010), o arquivo era enviado ao Storage sem nenhuma verificação de schema. Quando o usuário enviava um arquivo com número de colunas ou ordem diferente dos arquivos já existentes, a tabela externa quebrava: o BigQuery lê todos os arquivos sob o mesmo prefixo assumindo um único schema, então um arquivo divergente tornava a tabela inconsistente/inutilizável.

O problema acontecia inclusive com if_table_exists="replace", pois em tabelas particionadas o usuário pode atualizar apenas uma partição, e o upload para o Storage ocorre antes da tabela ser recriada.

Solução

Adiciona uma camada de verificação em Table.create, executada ANTES do upload para o Storage, sempre que a tabela de staging já existe. O novo método _validate_columns_against_staging compara as colunas do arquivo recebido (_get_columns_from_data) com as colunas atuais da tabela no BigQuery (_get_columns_from_bq), exigindo o mesmo número e a mesma ordem de colunas. Em caso de divergência, levanta BaseDosDadosException com uma mensagem que mostra as colunas esperadas e as recebidas, orientando a apagar e recriar a tabela caso a intenção seja mudar o schema.

Assim, um arquivo com schema incompatível nunca chega ao Storage e a tabela não é mais corrompida.

Esse problema apareceu ao subir a PNADC Educação com a @laribritto. Reportei para a @arteweyl em uma daily. O principal problema é que a pessoa deve fazer a verificação. Com esse alteração um erro é lançado

…tente no Table.create

Bug:
Ao usar `Table.create` para atualizar os dados de uma tabela que já existe
(por exemplo, enviando uma nova partição como `ano=2010`), o arquivo era
enviado ao Storage sem nenhuma verificação de schema. Quando o usuário
enviava um arquivo com número de colunas ou ordem diferente dos arquivos
já existentes, a tabela externa quebrava: o BigQuery lê todos os arquivos
sob o mesmo prefixo assumindo um único schema, então um arquivo divergente
tornava a tabela inconsistente/inutilizável.

O problema acontecia inclusive com `if_table_exists="replace"`, pois em
tabelas particionadas o usuário pode atualizar apenas uma partição, e o
upload para o Storage ocorre antes da tabela ser recriada.

Solução:
Adiciona uma camada de verificação em `Table.create`, executada ANTES do
upload para o Storage, sempre que a tabela de staging já existe. O novo
método `_validate_columns_against_staging` compara as colunas do arquivo
recebido (`_get_columns_from_data`) com as colunas atuais da tabela no
BigQuery (`_get_columns_from_bq`), exigindo o mesmo número e a mesma ordem
de colunas. Em caso de divergência, levanta `BaseDosDadosException` com uma
mensagem que mostra as colunas esperadas e as recebidas, orientando a
apagar e recriar a tabela caso a intenção seja mudar o schema.

Assim, um arquivo com schema incompatível nunca chega ao Storage e a tabela
não é mais corrompida.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@aspeddro aspeddro self-assigned this Jul 24, 2026
@mergify

mergify Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Tick the box to add this pull request to the merge queue (same as @mergifyio queue).

  • Queue this pull request

@aspeddro

Copy link
Copy Markdown
Collaborator Author

O erro ao materializar a tabela com o dbt

Database Error in model br_ibge_pnadceducacao (models/br_ibge_pnadc/br_ibge_pnadceducacao.sql)
  Error while reading table: basedosdados-dev.br_ibge_pnadc_staging.educacao, error message: Too many values in line. Found 277 column(s) when expecting 276.; line_number: 2 byte_offset_to_start_of_line: 2324 File: gs://basedosdados-dev/staging/br_ibge_pnadc/educacao/ano=2016/sigla_uf=AC/educacao.csv
  compiled code at target/run/basedosdados/models/br_ibge_pnadc/br_ibge_pnadc__educacao.sql

@aspeddro
aspeddro requested a review from a team July 27, 2026 13:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant