Skip to content

fix(mapas): descarta value acima de 100 KB na silver_agent_meta - #81

Merged
devwallyson merged 1 commit into
mainfrom
fix/mapas-silver-agent-meta
Oct 8, 2026
Merged

devwallyson merged 1 commit into
mainfrom
fix/mapas-silver-agent-meta

Conversation

@devwallyson

Copy link
Copy Markdown
Collaborator

Descrição

A silver_mapas_agent_meta não materializava. O dbt run abortava com
invalid memory alloc request size 1241514944, e sem ela os agentes do Mapas
ficam sem município, UF e CEP na silver, porque esses dados moram nas chaves
En_Municipio, En_Estado e En_CEP desta tabela.

A causa está no dado de origem. A mapas.bronze_agent_meta tem 29 valores entre
131 KB e 155 MB, todos nas chaves rcv_links_coletivo (22) e
rcv_sede_realizaAtividades_outros_lista (7). O conteúdo é a mesma string
reescapada a cada gravação no Mapas, só barras invertidas, e o tamanho dobra a
cada vez. O trim do valor de 155 MB pede 155.189.368 × 8 = 1.241.514.944 bytes
de uma vez, e o Postgres recusa qualquer alocação acima de 1 GB.

A correção mede o tamanho antes do trim e transforma em NULL o value
acima de 100 KB. A linha continua na silver; só o value fica nulo. O limite
fica longe dos dados legítimos: o maior valor legítimo dessas duas chaves tem
65 KB, e o de qualquer outra chave, 32 KB. A regra está documentada no
comentário do modelo e na descrição da coluna value no schema.yml.

Fora do escopo: silver_mapas_agent, silver_mapas_space e
silver_mapas_event_occurrence também falham, por outra causa. As colunas
location, _geo_location e frequency não existem na bronze, porque a carga
foi feita por um Trino sem o unsupported-type-handling=CONVERT_TO_VARCHAR do
catálogo mapas. Isso se resolve recarregando as três tabelas no Trino de
homologação, sem mudar código.

Issue relacionada

Refs #71

Tipo de mudança

  • Ingestão — cliente de API, DAG, carga
  • Modelo dbt — transformação, camada, teste
  • Correção de bug ou de inconsistência de dados
  • Infra / CI
  • Documentação
  • Outro: ___

Impacto em dados

  • Schemas e tabelas afetados: mapas.silver_agent_meta.
  • Camada: silver.
  • Precisa reexecutar alguma coisa depois do merge? dbt run --select silver_mapas_agent_meta. No dbanalytics, o modelo já foi rodado a partir desta branch.
  • Muda número que já está em uso? Não. A tabela não chegava a ser criada, então nenhum número dependia dela.

Como testar

cd dbt/minc
dbt run  --select silver_mapas_agent_meta
dbt test --select silver_mapas_agent_meta
-- linhas iguais à bronze; 29 value nulos nas duas chaves; maior value <= 100 KB
select count(*), count(distinct id),
       count(*) filter (where value is null
                        and key in ('rcv_links_coletivo', 'rcv_sede_realizaAtividades_outros_lista')),
       max(octet_length(value))
from mapas.silver_agent_meta;

Evidências

No dbanalytics, a partir desta branch:

Antes Depois
dbt run ERROR — invalid memory alloc request size 1241514944 OK created … [SELECT 6385537 in 27.09s]
Linhas tabela não criada 6.385.537 (bronze: 6.385.537)
id distintos — 6.385.537
value nulo pelo limite — 29
Maior value — 65.538 bytes
dbt test — PASS=4 (unique e not_null em id, not_null em object_id e key)

Checklist

  • Título segue Conventional Commits
  • Issue relacionada referenciada acima
  • Rodei make lint localmente — ou justifiquei abaixo por que não
  • Rodei make test localmente — ou justifiquei abaixo por que não
  • Testes dbt adicionados ou atualizados, se aplicável
  • Descrição das colunas atualizada no schema.yml, se criei ou alterei modelo
  • Nenhuma credencial, CPF, CNPJ ou dado pessoal no código, no log ou no print
  • Branch atualizada com origin/main
  • Documentação afetada atualizada

Lint e testes: a máquina onde a mudança foi feita não tem o Poetry instalado,
então make lint e make test não rodaram. O que rodou: sqlfmt --check no
modelo alterado, sem erro; dbt parse e dbt compile; e dbt run e dbt test do
modelo, com o resultado acima. O PR não muda Python, então o make test não exercita
nada do que foi alterado.

Testes dbt: os quatro testes existentes cobrem o modelo. O limite de 100 KB
não ganhou teste próprio.

Documentação: o make docs-collect não rodou. A descrição do value
mudou no schema.yml, e o site só reflete isso depois de uma nova coleta.

Arquitetura: o verificar.py aponta R1, R3 e R7 neste arquivo, mas as três já
existiam na main: a pasta mapas_dbt/silver e a silver lendo source(). Este PR
não acrescenta nenhuma. A migração de pasta está na branch
refactor/mapas-estrutura-adr-0010.

O modelo abortava com "invalid memory alloc request size 1241514944". A
bronze_agent_meta tem 29 valores de 131 KB a 155 MB, todos em
rcv_links_coletivo e rcv_sede_realizaAtividades_outros_lista, que são a
mesma string reescapada a cada gravação no Mapas: só barras invertidas. O
trim do de 155 MB pede 1,2 GB de uma vez e passa do limite do Postgres.

O tamanho agora é medido antes do trim, e o que passa de 100 KB vira NULL.
O maior valor legítimo de qualquer chave tem 65 KB. A linha continua na
silver, só o value fica nulo.

Rodado no dbanalytics: 6.385.537 linhas, igual à bronze, 29 value nulos
pelo limite, e os 4 testes do modelo passam.
@devwallyson
devwallyson merged commit c6b5d4d into main Oct 8, 2026
4 checks passed
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.

2 participants