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.
- Lê os 8 arquivos CSV do dataset (clientes, vendedores, produtos, pedidos, itens, pagamentos, avaliações e tradução de categorias).
- Limpa cada valor: remove espaços nas pontas, transforma texto vazio em nulo e converte números.
- Descarta linhas sem a chave obrigatória e conta valores que não puderam ser convertidos.
- Grava tudo em
olist.db, respeitando a ordem de dependência entre as tabelas. - Roda consultas de qualidade no fim e mostra os problemas encontrados.
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 |
- 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
deliverede 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
lenghtno lugar delengthnos 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.
- 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.
PreparedStatementem 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).
Requisitos: Java 21 e Maven 3.9 ou superior.
- 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.
- 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 testsrc/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
Java 21, Maven, JDBC com SQLite (sqlite-jdbc), Apache Commons CSV e JUnit 5.
- 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.
Dataset publicado pela Olist no Kaggle, sob licença CC BY-NC-SA 4.0. Os dados são anonimizados.