ETL - Exemplo prático
Uma das abordagens mais robustas para construir pipelines de dados é a estrutura medallion, que organiza os dados em diferentes camadas para garantir qualidade e acessibilidade ao longo do processo de análise.
O que é a estrutura medallion?
A estrutura medallion organiza os dados em três camadas distintas:
- Bronze (dados brutos): A primeira camada, onde os dados são armazenados exatamente como foram recebidos, sem nenhuma transformação. Esses dados podem vir de diversas fontes, como arquivos CSV, bancos de dados, APIs, entre outros. Eles servem como uma cópia fiel das fontes originais.
- Silver (dados filtrados e limpos): Na camada Silver, os dados da camada Bronze são processados e transformados para corrigir erros, remover duplicatas e padronizar formatos. Aqui, os dados já estão prontos para análises mais profundas, embora ainda possam conter informações redundantes.
- Gold (dados agregados e prontos para análise): A última camada é onde os dados são refinados e preparados para análises finais, relatórios e dashboards. Nesta etapa, os dados são agregados, sumarizados e otimizados para consultas rápidas.
Exemplo prático de um pipeline em Python
Imagine que você tem um arquivo CSV com dados de vendas de uma empresa, e deseja processá-los utilizando a estrutura medallion.
1. Extração (Extract) - Camada Bronze
Nesta etapa, os dados brutos são extraídos do arquivo CSV e diretamente armazenados na camada Bronze, que pode ser um banco de dados.
import pandas as pd
from sqlalchemy import create_engine
# Configurando a conexão com o banco de dados
engine = create_engine('sqlite:///data_pipeline.db')
# Extraindo os dados brutos do CSV
bronze_data = pd.read_csv('vendas_brutas.csv')
# Salvando na camada Bronze (no banco de dados/data warehouse)
bronze_data.to_sql('bronze_vendas', con=engine, if_exists='replace', index=False)
2. Transformação (Transform) - Camada Silver
Agora, os dados brutos são transformados, realizando limpeza e padronização na camada Silver. Isso pode incluir a remoção de valores nulos, a padronização de datas e a correção de formatos.
# Carregando os dados da camada Bronze para transformação
bronze_data = pd.read_sql('bronze_vendas', con=engine)
# Limpeza e transformação dos dados
## Removendo duplicatas
silver_data = bronze_data.drop_duplicates()
## Formatando o campo de data
silver_data['Data'] = pd.to_datetime(silver_data['Data'], format='%Y-%m-%d')
## Removendo caracteres
silver_data['Valor'] = silver_data['Valor'].str.replace(',', '').astype(float)
# Salvando na camada Silver (no banco de dados)
silver_data.to_sql('silver_vendas', con=engine, if_exists='replace', index=False)
3. Carregamento (Load) - Camada Gold
Finalmente, os dados transformados são carregados na camada Gold, prontos para análises avançadas.
# Carregando os dados da camada Silver para agregação e análise
silver_data = pd.read_sql('silver_vendas', con=engine)
# Agregando os dados para análises
gold_data = silver_data.groupby(['Produto', 'Região']).agg({'Valor': 'sum', 'Quantidade': 'sum'}).reset_index()
# Salvando na camada Gold (no banco de dados)
gold_data.to_sql('gold_vendas', con=engine, if_exists='replace', index=False)
Como estruturar essa arquitetura no banco de dados?
Para implementar a estrutura Medallion em um banco de dados, você pode organizar suas tabelas em diferentes schemas e manter uma hierarquia clara que reflita as camadas bronze, silver e gold. No exemplo anterior, apenas indicamos no nome das tabelas, mas o ideal é organizar os schemas.
Veja os exemplos abaixo:
1. Schemas
- Schema
bronze
: Armazena os dados brutos. - Schema
silver
: Armazena os dados limpos e transformados. - Schema
gold
: Armazena os dados prontos para análise e relatórios.
2. Hierarquia das Tabelas
Dentro de cada schema, você pode ter tabelas específicas para armazenar os dados correspondentes. Aqui está um exemplo detalhado, considerando diferentes fontes de dados:
- Camada Bronze:
- Tabela de vendas do sistema 1:
bronze.bronze_vendas_sistema1
- Tabela de clientes do CRM:
bronze.bronze_clientes_crm
- Tabela de vendas do sistema 1:
- Camada Silver:
- Tabela de vendas do sistema 1 transformada:
silver.silver_vendas_sistema1
- Tabela de clientes transformada:
silver.silver_clientes
- Tabela de vendas do sistema 1 transformada:
- Camada Gold:
- Tabela agregada de vendas:
gold.gold_vendas
- Tabela agregada de clientes:
gold.gold_clientes
- Tabela agregada de entregas:
gold.gold_entregas
- Tabela agregada de vendas:
Estrutura do pipeline de dados no projeto Python
project/
│
├── bronze/
│ ├── sistema1/
│ │ ├── extraction/
│ │ ├── transformation/
│ │ └── loading/
│ ├── sistema2/
│ │ ├── extraction/
│ │ ├── transformation/
│ │ └── loading/
│ └── ...
│
├── silver/
│ ├── sistema1/
│ │ ├── extraction/
│ │ ├── transformation/
│ │ └── loading/
│ ├── sistema2/
│ │ ├── extraction/
│ │ ├── transformation/
│ │ └── loading/
│ └── ...
│
└── gold/
├── sistema1/
│ ├── extraction/
│ ├── transformation/
│ └── loading/
├── sistema2/
│ ├── extraction/
│ ├── transformation/
│ └── loading/
└── ...