Skip to content

Projeto acadêmico: extração, processamento e persistência de grande volume de dados com DuckDB.

Notifications You must be signed in to change notification settings

tonsatomicos/duckdb-for-data-processing

Repository files navigation

Projeto de Linguagem de Programação para Engenharia de Dados
Explorando DuckDB

Este projeto foi concebido como parte de um desafio durante a disciplina de Linguagem de Programação para Engenharia de Dados, no curso de pós-graduação em Engenharia de Dados, na Universidade de Fortaleza (Unifor).

O desafio consistia em lidar com um extenso volume de dados fornecidos pelo Instituto Brasileiro de Geografia e Estatística (IBGE), no formato CSV, hospedados no Google Drive, sem depender de bibliotecas como Pandas e Spark. Optei por automatizar o processo de extração desses arquivos CSV para eliminar a necessidade de intervenção manual.

Para a leitura, processamento e persistência dos dados, escolhi utilizar o DuckDB. Os dados foram armazenados em um banco de dados PostgreSQL, o qual foi dockerizado para simplificar o gerenciamento do ambiente.

É importante salientar que os dados utilizados neste desafio estão disponíveis exclusivamente no Google Drive para os alunos da disciplina. No entanto, o projeto pode ser facilmente adaptado para outros contextos nos quais os dados estejam disponíveis.

Diagrama de Fluxo

Diagram

Sinta-se à vontade para clonar, adaptar e ajustar o projeto conforme necessário. Consulte as instruções abaixo, se precisar. 👽

Dependências do Projeto

Este projeto foi desenvolvido utilizando o Poetry + Pyenv para gerenciamento de ambientes virtuais e bibliotecas.

Bibliotecas Utilizadas

  • duckdb (v0.10.1)
  • jupyter (v1.0.0)
  • google-auth (v2.28.2)
  • google-auth-oauthlib (v1.2.0)
  • google-auth-httplib2 (v0.2.0)
  • google-api-python-client (v2.122.0)
  • python-dotenv (v1.0.1)

Instalação das Dependências

Você pode instalar as dependências manualmente, ou, utilizando o Poetry ou o Pip com os seguintes comandos:

Utilizando Poetry

poetry install

Utilizando Pip

pip install -r requirements.txt

Configurações do Projeto - Parte 1

Passos

  • Acesse o Google Cloud Console utilizando o link fornecido acima.
  • Crie um novo projeto no menu principal.
  • No menu lateral, navegue até "APIs e Serviços" > "Tela de Permissão OAuth" e adicione o seu endereço de e-mail como um usuário de teste.
  • Volte ao menu principal e selecione "Credenciais".
  • Crie um novo conjunto de credenciais selecionando "IDs do Cliente OAuth".
  • Baixe o arquivo de credenciais gerado e salve-o como credentials.json, na pasta config/credentials.
  • Na barra de pesquisa na parte superior da página, procure por "Google Drive API" e clique para ativar o serviço.
  • Crie um arquivo .env na pasta config e salve nele a seguinte linha:
    FOLDER_ID=id_da_pasta_google_drive
  • Substitua id_da_pasta_google_drive pelo ID da pasta do Google Drive que você deseja acessar para fazer o download dos arquivos.
  • O primeiro acesso irá abrir uma tela do Google para autenticação.

Conclusão

Após seguir esses passos, você estará pronto para automatizar o download dos arquivos do Google Drive. No entanto, esteja ciente de que este tutorial é uma orientação geral e pode precisar ser ajustado de acordo com as especificidades do seu projeto ou ambiente.

Configurações do Projeto - Parte 2

E é aqui que iniciamos a etapa de leitura, processamento e persistência dos dados. Após definirmos a estrutura da tabela temporária que receberá as informações do CSV com DuckDB, podemos prosseguir com as configurações do banco de dados PostgreSQL, onde persistiremos as informações.

Banco de dados PostgreSQL

Você pode escolher entre utilizar o Docker para subir um banco PostgreSQL ou instalar de outras maneiras.

Utilizando Docker

docker-compose up -d

Outras maneiras

Segue tutorial aleatório da Hashtag Treinamentos.
Script de criação da tabela disponibilizado em src/sql.

Conclusão

Lembre-se sempre de verificar o usuário, senha, base e porta. Procure na estrutura o seguinte código, localizado na função processing_persistence, e altere se necessário.

conn.execute("ATTACH 'dbname=unifor_duckdb user=unifor password=unifor host=localhost port=5437' AS db (TYPE postgres)")

Isso irá garantir que as informações sejam persistidas no banco de dados PostgreSQL.

Considerações Finais

  • Os arquivos CSV não estão disponíveis nas pastas raw e processed porque são muito pesados.
  • O código foi adaptado para lidar com erros, ou pelo menos auxiliar na compreensão deles, e para evitar o download de arquivos que já foram baixados anteriormente, etc.
  • Também inclui a "boa prática" de salvar o nome do arquivo na tabela, juntamente com a data e hora de processamento.
  • É notável o quão rápido o DuckDB conseguiu ler, processar e persistir mais de 100 milhões de linhas em minha máquina, levando cerca de 2 minutos para persistir, utilizando 24 GB de RAM. Surge um forte concorrente para o Spark? Veremos nos próximos episódios.

Image

About

Projeto acadêmico: extração, processamento e persistência de grande volume de dados com DuckDB.

Topics

Resources

Stars

Watchers

Forks