Projeto final da disciplina Data Engineering Programming do MBA em Engenharia de Dados da FIAP.
Gerar um relatório de pedidos de venda cujos pagamentos foram recusados (status=false) e que na avaliação de fraude foram classificados como legítimos (fraude=false), referentes ao ano de 2025, salvo em formato Parquet.
mba-data-engineering-programmin/
│
├── main.py # Aggregation Root - ponto de entrada
│
├── config/
│ ├── __init__.py
│ └── app_config.py # Configurações centralizadas
│
├── session/
│ ├── __init__.py
│ └── spark_session_manager.py # Gerenciamento da SparkSession
│
├── data_io/
│ ├── __init__.py
│ ├── data_reader.py # Leitura de pedidos (CSV) e pagamentos (JSON)
│ └── data_writer.py # Escrita em Parquet
│
├── business/
│ ├── __init__.py
│ └── orders_logic.py # Lógica de negócios (filtros, join, transformações)
│
├── pipeline/
│ ├── __init__.py
│ └── pipeline_orchestrator.py # Orquestração do pipeline
│
├── test_orders_logic.py # Testes unitários com pytest
│
├── pyproject.toml
├── requirements.txt
├── MANIFEST.in
└── README.md
- Python 3.9+
- Java 8+ (necessário para o PySpark)
- pip
- Git
git clone https://github.com/leo8nardo8/mba-data-engineering-programmin.git
cd mba-data-engineering-programminpython -m venv .venv
# Linux/macOS
source .venv/bin/activate
# Windows (PowerShell)
.venv\Scripts\Activate.ps1pip install -r requirements.txtOs datasets devem estar disponíveis localmente na raiz do projeto:
git clone https://github.com/infobarbosa/datasets-csv-pedidos.git
git clone https://github.com/infobarbosa/dataset-json-pagamentos.gitA estrutura esperada após clonar:
mba-data-engineering-programmin/
├── datasets-csv-pedidos/
│ └── data/pedidos/
└── dataset-json-pagamentos/
└── data/pagamentos/
O PySpark no Windows requer o winutils.exe. Baixe os arquivos do repositório:
https://github.com/cdarlint/winutils/tree/master/hadoop-3.3.5/bin
Crie a pasta C:\hadoop\bin\ e coloque os arquivos winutils.exe e hadoop.dll nela.
A configuração do HADOOP_HOME já está definida automaticamente no app_config.py:
os.environ["HADOOP_HOME"] = "C:\\hadoop"python main.pyO relatório será gerado no diretório output/relatorio_pedidos_recusados/ em formato Parquet.
Exemplo de log esperado ao executar com sucesso:
INFO - Iniciando pipeline de orquestração...
INFO - Iniciando processamento da lógica de negócios...
INFO - Calculando valor total dos pedidos...
INFO - Normalizando campos de pagamentos...
INFO - Realizando join entre pedidos e pagamentos...
INFO - Aplicando filtros: status=False, fraude=False, ano=2025...
INFO - Selecionando colunas do relatório...
INFO - Processamento concluído. Total de registros: 1473
INFO - Gravando resultado em Parquet: output/relatorio_pedidos_recusados
INFO - Pipeline concluído com sucesso.
pytest test_orders_logic.py -vExemplo de saída esperada:
test_orders_logic.py::TestOrdersLogic::test_retorna_apenas_pedidos_recusados_legitimos_2025 PASSED
test_orders_logic.py::TestOrdersLogic::test_colunas_do_resultado PASSED
test_orders_logic.py::TestOrdersLogic::test_resultado_vazio_sem_registros_validos PASSED
3 passed in 38.35s
Para execução com relatório de cobertura:
pytest test_orders_logic.py -v --cov=business --cov-report=term-missing| Coluna | Descrição |
|---|---|
| id_pedido | Identificador único do pedido |
| uf | Estado (UF) onde o pedido foi feito |
| forma_pagamento | Forma de pagamento utilizada |
| valor_total | Valor total do pedido |
| data_pedido | Data de criação do pedido |
Ordenação: UF → forma_pagamento → data_pedido
pagamento.status = false→ pagamento recusadoavaliacao_fraude.fraude = false→ classificado como legítimoano(data_criacao) = 2025
| Critério | Descrição | Status |
|---|---|---|
| Schemas explícitos | Todos os DataFrames com schema definido | ✅ |
| Orientação a objetos | Todos os componentes encapsulados em classes | ✅ |
| Injeção de dependências | Dependências instanciadas e injetadas no main.py |
✅ |
| Configurações centralizadas | Classe AppConfig com todos os parâmetros |
✅ |
| Sessão Spark | Classe SparkSessionManager dedicada |
✅ |
| Leitura e Escrita (I/O) | Classes DataReader e DataWriter |
✅ |
| Lógica de negócio | Classe OrdersLogic com filtros e join |
✅ |
| Orquestração do pipeline | Classe PipelineOrchestrator |
✅ |
| Logging | Configurado na classe de lógica de negócios | ✅ |
| Tratamento de erros | Estrutura try/except com logging de erros |
✅ |
| Empacotamento | pyproject.toml, requirements.txt, MANIFEST.in |
✅ |
| Testes unitários | 3 testes passando com pytest |
✅ |
- Pedidos (CSV): https://github.com/infobarbosa/datasets-csv-pedidos
- Pagamentos (JSON): https://github.com/infobarbosa/dataset-json-pagamentos