Executando verificação de segurança...
23

[Open Source] CNPJ Data Pipeline – 50 M de CNPJs no seu PostgreSQL sem dor de cabeça 🚀

Você já abriu os dumps da Receita e viu 85 GB de CSV em ISO-8859-1?
Eu também. Depois de travar uma VPS de 4 GB tentando importar linha por linha, escrevi um pipeline que faz o trabalho sujo por nós — e decidi liberar o código.


O que ele entrega

  • Arquitetura modular — separa download, parsing e banco; fácil estender.
  • PostgreSQL de primeira classe — placeholders para MySQL/BigQuery já no código.
  • Estratégia inteligente — detecta sua RAM e escolhe memory_constrained, high_memory ou distributed.
  • Incremental por design — baixa só o que mudou, não reprocessa ZIP já marcado.
  • Bulk-upsert via COPY — 10 × mais rápido que INSERT tradicional em nossos testes.
  • Setup sem fricçãopython setup.py cria um .env otimizado; ou roda tudo em Docker.

Benchmarks de campo

MáquinaRAMTempo p/ dump completo
VPS 4 GB4 GB~12 h
Notebook Dev16 GB~3 h
Server 64 GB+64 GB~1 h

Mãos à obra

git clone https://github.com/cnpj-chat/cnpj-data-pipeline
cd cnpj-data-pipeline

# modo interativo
python setup.py

# ou direto no Docker
docker-compose --profile postgres up --build

Vai pegar um café; quando voltar, seu banco terá 50 M CNPJs prontos para query.


Exemplo de query

-- Startups de software abertas em SP nos últimos 3 anos
SELECT COUNT(*)
FROM estabelecimentos e
JOIN empresas emp ON e.cnpj_basico = emp.cnpj_basico
WHERE e.uf = 'SP'
  AND e.cnae_fiscal_principal LIKE '62%'          -- Software
  AND e.data_inicio_atividade > CURRENT_DATE - INTERVAL '3 years'
  AND emp.porte IN ('01', '03');                  -- ME ou EPP

Como você pode ajudar

Conte nos comentários:

  • Em que hardware rodou e quanto tempo levou?
  • Que insights ou pain points de mercado você resolve com esse dataset?
  • Sugestões de otimização ou novos back-ends?
  • Encontrou algum bug?

Feedbacks e contribuições são sempre bem-vindos ❤️


Reflexão final

Planilhas públicas só geram valor quando viram infraestrutura de consulta.
Transformar dados brutos em SQL rápido é a ponte entre burocracia e inovação; cada melhoria nesse pipeline diminui o atrito para quem resolve problemas reais com software.

Carregando publicação patrocinada...
3
2

Você tocou no dilema clássico: build vs buy. Por que processar 85GB se a BrasilAPI já existe?

Na minha visão é que servem casos diferentes:

APIs (BrasilAPI, ReceitaWS):

  • Consulta pontual de CNPJ (200ms)
  • Zero infra, sempre atualizado
  • Limite de requests, sem SQL complexo

Pipeline próprio:

  • Queries tipo "todas fintechs de SP fundadas pós-2020"
  • JOINs complexos, análise em massa
  • 100GB de disco, manutenção mensal

Pensei em comparar e documentar a diferença entre os dados, abri um issue para isso:
https://github.com/cnpj-chat/cnpj-data-pipeline/issues/14

3

Meus 2 cents,

Para os apressados de plantao, NAO SAO DADOS OBTIDOS DE FORMA ILEGAL (como aqueles CDs que sao vendidos na Sta Efigenia/ML/OLX/etc com dados de CPF), sao dados publicos e disponibilizados para download pela propria receita.

O endereco original da receita eh:

https://arquivos.receitafederal.gov.br/dados/cnpj/dados_abertos_cnpj

Sobre dados publicos: para quem conhece os caminhos (e totalmente legais), obter copias de certidao de inteiro teor de empresas e coisas do genero eh relativamente simples (o limite eh o custo). Sobre privacidade: estamos falando de empresas - algo totalmente diferente do nivel de privacidade exigido para lidar com informacoes pessoais de cidadaos/pessoas comuns.

O que o script fez foi automatizar este download e criar uma metodologia de autoconfiguracao do BD para comportar estes dados da melhor forma possivel.

Alias, o script ficou excelente - Parabens !

Obrigado por compartilhar - saude e sucesso !!!

3
2
2

Eu faço uma estratégia parecida:
Eu faço o tratamento dos dados antes de inserir, removendo caracteres, linhas duplicadas e etc
Depois eu importo os dados para uma base de dados vazia através do bulk insert.
Logo em seguida eu faço o insert dos dados em outras tabelas já fazendo o tratamento de alguns dados, joins e indices.
No final tenho uma tabela gigantesca não só com os dados de estabelecimento, mas tbm da tabela empresas, simples nacional e demais, de forma que eu não precise fazer um Join para obter os dados, já que isto pode ser muito demorado dependendo da situação.

2
2

Acredita que eu estava investigando uma forma de fazer isso ontem pelos dados públicos? Você é o máximo! Ganhou meu respeito e o repositório ganhou uma estrelinha. Parabéns!

1

Esse é o conceito de OSS, se eu já fiz todo o trabalho necessário porque não compartilhar com outras pessoas que também precisam da mesma informação (já que... digamos o dado não vem tão pronto assim 🙃)

2