Skip to content

About

Pipeline ETL em Java que lê os CSVs do dataset da Olist, limpa os dados e carrega em SQLite. JDBC, Maven e testes com JUnit.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

olist-etl-java

Pipeline de carga (ETL) em Java que lê os arquivos CSV do dataset público de e-commerce da Olist, limpa os dados e grava tudo em um banco SQLite pronto para consultas em SQL, análises em Python e dashboards.

Este é o primeiro projeto de uma série sobre o mesmo dataset. O banco gerado aqui serve de base para os demais.

O que o projeto faz

  1. Lê os 8 arquivos CSV do dataset (clientes, vendedores, produtos, pedidos, itens, pagamentos, avaliações e tradução de categorias).
  2. Limpa cada valor: remove espaços nas pontas, transforma texto vazio em nulo e converte números.
  3. Descarta linhas sem a chave obrigatória e conta valores que não puderam ser convertidos.
  4. Grava tudo em olist.db, respeitando a ordem de dependência entre as tabelas.
  5. Roda consultas de qualidade no fim e mostra os problemas encontrados.

Resultado da carga

Execução com o dataset completo, em cerca de 4 segundos:

Tabela Linhas lidas Linhas gravadas
customers 99.441 99.441
sellers 3.095 3.095
products 32.951 32.951
category_translation 71 71
orders 99.441 99.441
order_items 112.650 112.650
order_payments 103.886 103.886
order_reviews 99.224 99.224

Problemas encontrados nos dados

  • 610 produtos sem categoria.
  • 2 categorias usadas em produtos que não existem na tabela de tradução para inglês.
  • 8 pedidos com status delivered e sem data de entrega ao cliente.
  • O arquivo de tradução de categorias começa com um BOM (caractere invisível), que quebrava a leitura do cabeçalho. O carregador agora ignora esse caractere.
  • O CSV de produtos traz lenght no lugar de length nos nomes de duas colunas. No banco os nomes foram corrigidos.

Não há registros órfãos: todo item aponta para um pedido, produto e vendedor existentes, e todo pedido aponta para um cliente existente.

Decisões de projeto

  • SQLite: o banco é um único arquivo, sem servidor para instalar. Isso facilita rodar o projeto em qualquer máquina e abrir o resultado no Power BI ou em ferramentas de SQL.
  • Definição das tabelas em uma lista (Definicoes.java), com um carregador genérico. Para incluir uma tabela nova basta descrevê-la, sem escrever outra rotina de leitura.
  • Inserção em lotes de 5.000 linhas dentro de uma transação. Sem isso, o SQLite grava linha a linha em disco e a carga leva muito mais tempo.
  • PreparedStatement em vez de montar o SQL por concatenação de texto, para evitar SQL injection e reaproveitar o comando compilado.
  • Datas como texto no formato ISO (2017-10-02 10:56:33). É o formato que o SQLite entende nas funções de data.
  • Tabela de geolocalização fora da carga. Ela tem 61 MB e cerca de um milhão de linhas com CEPs repetidos, e nenhuma análise prevista precisa dela.
  • Chaves estrangeiras declaradas no schema, mas não impostas pelo SQLite. A integridade é conferida por consultas depois da carga (Verificacoes.java).

Como executar

Requisitos: Java 21 e Maven 3.9 ou superior.

  1. Baixe o dataset Brazilian E-Commerce Public Dataset by Olist no Kaggle e extraia os CSVs em uma pasta. Os dados não estão neste repositório.
  2. Rode, informando a pasta dos CSVs:
mvn compile exec:java -Dexec.args="caminho/para/olist"

Sem argumentos, o programa procura os CSVs na pasta ../olist. Um segundo argumento opcional define o nome do arquivo do banco (padrão: olist.db).

Para rodar os testes:

mvn test

Estrutura

src/main/java/dev/lucasluz/olistetl/
    Main.java             ponto de entrada e resumo da carga
    BancoDeDados.java     abre o SQLite e cria as tabelas
    Definicoes.java       descrição das 8 tabelas
    DefinicaoTabela.java  arquivo CSV, tabela e colunas
    Coluna.java           coluna do CSV ligada a coluna do banco
    Tipo.java             texto, inteiro ou decimal
    CarregadorCsv.java    leitura, limpeza e gravação
    Resultado.java        contagem de linhas de cada carga
    Verificacoes.java     consultas de qualidade pós-carga
src/main/resources/schema.sql
src/test/java/.../CarregadorCsvTest.java

Tecnologias

Java 21, Maven, JDBC com SQLite (sqlite-jdbc), Apache Commons CSV e JUnit 5.

Próximos passos da série

  • Modelagem dimensional e consultas de negócio em SQL sobre este banco.
  • Modelo em Python para prever atraso de entrega.
  • Dashboard em Power BI com vendas, entrega e risco de atraso.

Dados

Dataset publicado pela Olist no Kaggle, sob licença CC BY-NC-SA 4.0. Os dados são anonimizados.

About

Pipeline ETL em Java que lê os CSVs do dataset da Olist, limpa os dados e carrega em SQLite. JDBC, Maven e testes com JUnit.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages