Projeto para demonstrar a implementação simples de um ELT através de um Data Lake criado com Python, DuckDB e Parquet.
- Armazenamento em formato Parquet dos dados;
- Processamento realizado com DuckDB;
- Suporte a formatos de entrada em Pandas e Polars;
- Particionamento de dados por data;
- Consultas SQL nativas;
- Velocidade de processamento do DuckDB;
- Baixo custo de implementação;
- Tipo mais eficiente de armazenamento;
datalake.py: Script principal com a implementação do Data Lake;data/: Pasta que armazena os dados;requirements.txt: Lista as bibliotecas que são as dependências do projeto;README.md: O arquivo que documenta o projeto;
- Ingestão de dados;
- Aramazenamento em formato Parquet;
- Consultas SQL no DuckDB;
- Análise de dados;
- Particionamento de dados;
- Versionamento automático;
- Logging das operações;
Feita em dois formatos principais:
- Através de Pandas;
- Através de Polars;
# Dados de exemplo
data = pd.Dataframe({
'id': range(1,6),
'nome': ['Maria', 'Marta', 'Marcos', 'Mateus', 'Michel'],
'idade': [25, 37, 19, 41, 30],
'data_criacao': pd.date_range(start='2026-01-01', periods=5)
})
# Ingestão particionando
file_path = dl.ingest_data(data, 'usuarios', partition_by='data_criacao')Dados armazenados seguindos os passos: 1. Conversão para Pandas se necessário; 2. Marcado com timestamp para o versionamento; 3. Armazenamento em arquivo Parquet;
data/
|-- usuarios_20260101_120000.parquet
|-- usuarios_20260102_120000.parquet
|-- ...Realizar consulta nos dados com SQL através do DuckDB:
# Consulta
query = """
SELECT nome, idade
FROM usuarios
WHERE idade >= 30
"""
result = dl.query_data(query)- Python 3.12+
- Dependências descritas no
requirements.txt
- Clone o repositório;
- Crie um ambiente virtual:
python -m venv venv
source venv/bin/activate # Linux/Mac
# ou
.\venv\Scripts\activate # Windows- Instale as dependências:
pip install -r requirements.txtExecute o script principal:
python datalake.py dl = Datalake()
data = pd.DataFrame({
'id': range(1, 6),
'nome': ['Maria', 'Marta', 'Marcos', 'Mateus', 'Michel'],
'idade': [25, 37, 19, 41, 30],
'data_criacao': pd.date_range(start='2026-01-01', periods=5)
})
file_path = dl.ingest_data(data, 'usuarios', partition_by='data_criacao', mode='append')
dl.register_parquet_file(file_path, 'usuarios')
query = """
SELECT nome, idade
FROM usuarios
WHERE idade >=30
"""
result = dl.query_data(query)
print(result)