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

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

Você já abriu os dumps da Receita e viu 21 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~8 h
Notebook Dev16 GB~2 h
Server 64 GB+64 GB~1 h

Resultado processado:

  • 63+ milhões de empresas
  • 66+ milhões de estabelecimentos
  • 26+ milhões de sócios
  • ~29GB de banco PostgreSQL

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á 63M 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...
4

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

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

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
1

Talvez sirva para algum propósito, mas já pensaram em disponibilizar esses CNPJ segmentados por estado e por ano? Acho que evitaria baixar todo o conjunto para análises mais pontuais.

1

Pois é! Baixar 85GB de dados pra analisar só empresas de MG não faz muito sentido mesmo.

O desafio é que a Receita Federal disponibiliza os dados em blocos nacionais (Empresas0-9.zip, Estabelecimentos0-9.zip). Mas podemos criar uma camada de "sharding" pós-processamento!

Estou imaginando algo assim:

# Ao invés de processar tudo:
python main.py

# Poder filtrar na origem:
python main.py --estados=SP,RJ --anos=2023,2024

Ou melhor ainda, pré-processar e disponibilizar downloads segmentados:

/dados/
  /por-estado/
    SP-2024.parquet  (2GB)
    MG-2024.parquet  (800MB)
  /por-ano/
    2024-completo.parquet (15GB)

Criei uma issue pra isso: https://github.com/cnpj-chat/cnpj-data-pipeline/issues/19

0