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.
Sinta-se à vontade para clonar, adaptar e ajustar o projeto conforme necessário. Consulte as instruções abaixo, se precisar. 👽
Este projeto foi desenvolvido utilizando o Poetry + Pyenv para gerenciamento de ambientes virtuais e bibliotecas.
- 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)
Você pode instalar as dependências manualmente, ou, utilizando o Poetry ou o Pip com os seguintes comandos:
poetry install
pip install -r requirements.txt
- Acesso ao Google Cloud Console: console.cloud.google.com.
- Conta de e-mail para configuração de permissões.
- 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 pastaconfig
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.
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.
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.
Você pode escolher entre utilizar o Docker para subir um banco PostgreSQL ou instalar de outras maneiras.
docker-compose up -d
Segue tutorial aleatório da Hashtag Treinamentos.
Script de criação da tabela disponibilizado em src/sql
.
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.
- Os arquivos CSV não estão disponíveis nas pastas
raw
eprocessed
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.