Ir para o conteúdo

Contextualização do Trabalho

Visão Geral

Este projeto explora o ecossistema moderno de Data Lakehouse, combinando o poder de processamento distribuído do Apache Spark com dois dos formatos de tabela open-source mais relevantes do mercado: Delta Lake e Apache Iceberg.

O trabalho foi desenvolvido como atividade avaliativa da disciplina de Arquitetura de Dados da SATC – Associação Beneficente da Indústria Carbonífera de Santa Catarina.


Cenário de Negócio: TechStore — Loja Virtual

O cenário escolhido simula o sistema transacional de uma loja virtual chamada TechStore, que vende produtos eletrônicos. As operações de INSERT, UPDATE e DELETE representam situações reais do dia a dia de um e-commerce:

  • Clientes se cadastram, atualizam seus dados e podem ser removidos da base.
  • Produtos têm preços e estoque atualizados com frequência.
  • Pedidos passam por mudanças de status ao longo do tempo.
  • Itens de pedido registram o que foi comprado em cada transação.

Modelo Entidade-Relacionamento

erDiagram
    CLIENTES {
        int cliente_id PK
        string nome
        string email
        string cidade
        string estado
        date data_cadastro
    }
    PRODUTOS {
        int produto_id PK
        string nome
        string categoria
        decimal preco
        int estoque
    }
    PEDIDOS {
        int pedido_id PK
        int cliente_id FK
        date data_pedido
        string status
        decimal valor_total
    }
    ITENS_PEDIDO {
        int item_id PK
        int pedido_id FK
        int produto_id FK
        int quantidade
        decimal preco_unitario
    }

    CLIENTES ||--o{ PEDIDOS : "realiza"
    PEDIDOS ||--|{ ITENS_PEDIDO : "contém"
    PRODUTOS ||--o{ ITENS_PEDIDO : "é incluído em"

DDL das Tabelas (SQL padrão)

Tabela clientes

CREATE TABLE clientes (
    cliente_id   INT          NOT NULL,
    nome         VARCHAR(100) NOT NULL,
    email        VARCHAR(150) NOT NULL UNIQUE,
    cidade       VARCHAR(80),
    estado       CHAR(2),
    data_cadastro DATE        NOT NULL,
    PRIMARY KEY (cliente_id)
);

Tabela produtos

CREATE TABLE produtos (
    produto_id  INT            NOT NULL,
    nome        VARCHAR(150)   NOT NULL,
    categoria   VARCHAR(80)    NOT NULL,
    preco       DECIMAL(10, 2) NOT NULL,
    estoque     INT            NOT NULL DEFAULT 0,
    PRIMARY KEY (produto_id)
);

Tabela pedidos

CREATE TABLE pedidos (
    pedido_id    INT            NOT NULL,
    cliente_id   INT            NOT NULL,
    data_pedido  DATE           NOT NULL,
    status       VARCHAR(30)    NOT NULL DEFAULT 'PENDENTE',
    valor_total  DECIMAL(12, 2) NOT NULL,
    PRIMARY KEY (pedido_id),
    FOREIGN KEY (cliente_id) REFERENCES clientes(cliente_id)
);

Tabela itens_pedido

CREATE TABLE itens_pedido (
    item_id        INT            NOT NULL,
    pedido_id      INT            NOT NULL,
    produto_id     INT            NOT NULL,
    quantidade     INT            NOT NULL,
    preco_unitario DECIMAL(10, 2) NOT NULL,
    PRIMARY KEY (item_id),
    FOREIGN KEY (pedido_id)  REFERENCES pedidos(pedido_id),
    FOREIGN KEY (produto_id) REFERENCES produtos(produto_id)
);

Fonte de Dados

Os dados utilizados nos notebooks são sintéticos, gerados pela biblioteca Faker para Python. Essa abordagem garante:

  • Reprodutibilidade total (sem dependência de APIs externas ou arquivos externos).
  • Dados realistas com nomes, e-mails e cidades brasileiras.
  • Volume configurável para simular cenários de médio porte.

Volume de Dados Gerado

Tabela Registros
clientes 100
produtos 30
pedidos 200
itens_pedido ~500

Tecnologias Utilizadas

Tecnologia Versão Função
Python 3.11 Linguagem principal
Apache Spark 3.5.3 Motor de processamento distribuído
PySpark 3.5.3 API Python para o Spark
Delta Lake 3.2.0 Formato de tabela open-source (ACID)
Apache Iceberg 1.6.1 Formato de tabela open-source (open std.)
JupyterLab 4.x Ambiente interativo de notebooks
UV latest Gerenciador de pacotes e projetos Python
MKDocs Material 9.x Geração da documentação web

Estrutura do Projeto

spark-lakehouse/
├── .python-version          # Versão do Python (3.11)
├── pyproject.toml           # Configuração do projeto e dependências (UV)
├── uv.lock                  # Lock file gerado pelo UV
├── README.md                # Instruções de reprodução do ambiente
├── mkdocs.yml               # Configuração da documentação web
├── notebooks/
│   ├── delta_lake.ipynb     # Notebook: Delta Lake com PySpark
│   └── iceberg.ipynb        # Notebook: Apache Iceberg com PySpark
└── docs/
    ├── index.md             # Esta página — contextualização
    ├── spark.md             # Apache Spark / PySpark
    ├── delta.md             # Delta Lake
    └── iceberg.md           # Apache Iceberg

Operações Demonstradas

Ambos os notebooks cobrem as mesmas operações fundamentais de manipulação de dados, permitindo uma comparação direta entre Delta Lake e Iceberg:

Operação Delta Lake Apache Iceberg
INSERT df.write.format("delta") df.write.format("iceberg")
UPDATE DeltaTable.update() spark.sql("UPDATE ...")
DELETE DeltaTable.delete() spark.sql("DELETE ...")
MERGE DeltaTable.merge() spark.sql("MERGE INTO ...")
Time Travel VERSION AS OF FOR SYSTEM_TIME AS OF
Schema Evolution mergeSchema ✅ Automático