Suporta três modos de ingestão: arquivos CSV locais, arquivos Parquet locais e download direto da API pública da NYC TLC.
Objetivo
Demonstrar domínio de engenharia de dados com foco em arquitetura de dados em camadas, validação de qualidade, rastreabilidade operacional e carga confiável.
- Arquitetura de dados em camadas (Landing → Staging → Core)
- Stored procedures T-SQL com conversão segura, validação e deduplicação
- Código C# orientado a objetos com separação de responsabilidades (Clean Architecture)
- Controle de lote, rastreabilidade e tratamento de erros
- Carga idempotente e deduplicação por hash SHA2_256
- Qualidade de dados com 11 regras de validação e rejeição documentada
- Ingestão multi-formato (CSV, Parquet e API pública)
Arquitetura
O pipeline foi desenhado para suportar múltiplas entradas de dados, leitura automática por formato e processamento em camadas até a carga final confiável.
Arquitetura em Camadas — C#
A aplicação foi estruturada para separar entrada, orquestração, infraestrutura e domínio, facilitando manutenção e evolução do projeto.
Fluxo do Pipeline
Cada execução segue 8 etapas sequenciais do início do lote até a carga final e fechamento com métricas.
Fluxo de Processamento de Dados
O processamento evolui do dado bruto até a base confiável, preservando rastreabilidade e controle de qualidade.
Tecnologias
| Componente | Tecnologia |
|---|---|
| Banco de dados | SQL Server 2019+ |
| Linguagem | C# / .NET 9 |
| Acesso ao banco | Microsoft.Data.SqlClient 5.2.2 |
| Leitura Parquet | Parquet.Net |
| Injeção de dependência | Microsoft.Extensions.DependencyInjection |
| Configuração | Microsoft.Extensions.Configuration |
| Logging | Microsoft.Extensions.Logging |
| Bulk insert | SqlBulkCopy |
| Download API | HttpClient (streaming) |
| Deduplicação | HASHBYTES SHA2_256 |
Estrutura do Projeto
Pré-requisitos
| Requisito | Versão mínima |
|---|---|
| SQL Server | 2019 (Express, Developer ou Standard) |
| .NET SDK | 9.0 |
| Permissões | sysadmin ou dbcreator no SQL Server |
Instalação e Configuração
1. Clonar o Repositório
2. Criar o Banco de Dados
Execute os scripts SQL na ordem numérica no SQL Server Management Studio, Azure Data Studio ou sqlcmd.
3. Configurar a Connection String
Crie o arquivo src/TaxiPipeline.Console/appsettings.Development.json.
4. Restaurar Dependências e Compilar
Modos de Execução
Processar todos os arquivos do diretório de entrada
Processa todos os arquivos que correspondam ao padrão FilePattern no InputDirectory.
Processar um arquivo específico
Download e processamento da API NYC TLC
Exibir ajuda
Schemas do Banco de Dados
| Schema | Responsabilidade | Tabelas |
|---|---|---|
| ops | Controle operacional: batch, logs, erros, métricas de qualidade | 4 tabelas |
| landing | Dados brutos exatamente como vieram do arquivo | 2 tabelas |
| staging | Dados limpos, tipados, validados e deduplicados | 2 tabelas |
| core | Dados finais confiáveis — single source of truth | 1 tabela |
Stored Procedures
| Procedure | Schema | O que faz |
|---|---|---|
| usp_start_batch | ops | Cria registro no BatchControl e retorna @batch_id. |
| usp_finish_batch | ops | Atualiza status, métricas e timestamps do batch. |
| usp_log_error | ops | Registra erros no ExecutionError e ExecutionLog. |
| usp_insert_yellow_trip_raw | landing | Insert individual no landing como backup ao BulkCopy. |
| usp_clean_yellow_trip_data | staging | Converte com TRY_CAST, calcula duração e gera hash SHA2_256. |
| usp_reject_invalid_yellow_trip_data | staging | Aplica 11 regras e move inválidos para rejected. |
| usp_deduplicate_yellow_trip_data | staging | Marca duplicados intra-batch e cross-batch. |
| usp_load_trip | core | Insere apenas registros únicos e válidos. |
Todas as procedures são idempotentes: limpam dados do batch antes de reprocessar.
Regras de Validação
A procedure staging.usp_reject_invalid_yellow_trip_data aplica 11 regras de qualidade.
| Código | Regra | Campo |
|---|---|---|
| R001 | pickup_datetime não pode ser NULL ou inválido | pickup_datetime |
| R002 | dropoff_datetime não pode ser NULL ou inválido | dropoff_datetime |
| R003 | dropoff deve ser posterior ao pickup | pickup/dropoff |
| R004 | trip_distance não pode ser negativa | trip_distance |
| R005 | fare_amount não pode ser negativo | fare_amount |
| R006 | total_amount não pode ser negativo | total_amount |
| R007 | passenger_count deve estar entre 0 e 9 | passenger_count |
| R008 | Duração da corrida não pode exceder 12 horas | calculado |
| R009 | total_amount não pode ser menor que fare_amount | total/fare |
| R010 | pickup_location_id deve estar entre 1 e 265 | pickup_location_id |
| R011 | dropoff_location_id deve estar entre 1 e 265 | dropoff_location_id |
Deduplicação
A deduplicação acontece em dois níveis para garantir consistência e idempotência.
Composição do hash (SHA2_256)
O índice UNIQUE em core.Trip.row_hash é a garantia final contra duplicatas.
Projetos C#
TaxiPipeline.Domain
| Arquivo | Descrição |
|---|---|
| AppSettings.cs | POCO com connection string, diretórios, API e limites. |
| BatchContext.cs | Contexto de execução com BatchId e métricas. |
| TripRecord.cs | Entidade com 19 campos como string?. |
| BatchStatus.cs | Enum com estados do batch. |
| PipelineStep.cs | Enum com as 8 etapas do pipeline. |
| I*Service.cs | Interfaces que definem os contratos do sistema. |
TaxiPipeline.Application
| Arquivo | Descrição |
|---|---|
| PipelineOrchestrator.cs | Executa as 8 etapas em sequência com tratamento de erro e logging. |
TaxiPipeline.Infrastructure
| Arquivo | Descrição |
|---|---|
| TaxiApiService.cs | Download streaming com cache local e rename atômico. |
| SqlConnectionFactory.cs | Centraliza criação de conexões SQL Server. |
| BatchService.cs | Start/Finish batch via stored procedures. |
| RawLoadService.cs | SqlBulkCopy com DataTable e mapeamento de colunas. |
| StoredProcedureExecutor.cs | Execução genérica de SPs com output parameter. |
| CsvFileReaderService.cs | Parser CSV com mapeamento flexível. |
| ParquetFileReaderService.cs | Leitura Parquet com suporte a limite de registros. |
| FileReaderResolver.cs | Detecta extensão e delega ao leitor correto. |
| ExecutionLogger.cs | Logging duplo: console e banco. |
Configurações
O arquivo appsettings.json contém as configurações base sem credenciais reais.
Hierarquia de Configuração
Segurança — Proteção de Credenciais
| Mecanismo | Detalhes |
|---|---|
| appsettings.json | Contém apenas placeholders. |
| appsettings.Development.json | Credenciais reais, ignorado pelo Git. |
| appsettings.Local.json | Alternativa local, também ignorado pelo Git. |
| Variáveis de ambiente | Prefixo TAXIPIPELINE_ com maior prioridade. |
| .gitignore | Exclui arquivos locais de configuração e dados baixados. |
Consultas de Verificação
Decisões Técnicas
- Landing com NVARCHAR: preserva o dado original sem perda por conversão prematura.
- TRY_CAST no staging: conversão segura que retorna NULL em vez de erro.
- SqlBulkCopy: performance muito superior ao insert linha a linha.
- SHA2_256: reduz drasticamente o risco de colisão.
- Idempotência: cada procedure limpa dados do batch antes de reprocessar.
- 4 schemas: separação clara entre bruto, tratado, final e controle.
- Logging duplo: console para dev e banco para auditoria.
- Download atômico: uso de arquivo temporário antes do rename final.
Melhorias Futuras
- Processamento paralelo de múltiplos arquivos
- Dashboard de monitoramento com métricas de qualidade
- Testes unitários e de integração
- Containerização com Docker + Docker Compose
- CI/CD com GitHub Actions
- Notificações por email ou Slack em caso de falha
- Particionamento por data em core.Trip
- Suporte a carga incremental por watermark
- Migração automática de schema com DbUp ou Flyway
- Suporte a múltiplos tipos de táxi
Fonte de Dados
| Informação | Valor |
|---|---|
| Fonte oficial | NYC Taxi & Limousine Commission (TLC) |
| CDN (Parquet) | https://d37ci6vzurychx.cloudfront.net/trip-data/ |
| Período disponível | 2009 até cerca de 2 meses atrás |
| Volume mensal | Aproximadamente 3 milhões de registros |
| Formato | Apache Parquet |
Material de Estudos e Referências
Este projeto foi construído com base em vivência profissional com SQL Server e C#, complementada por documentação oficial e material de estudo.
Curso
| Curso | Plataforma | Instrutor |
|---|---|---|
| Programação Orientada a Objetos com C# | Udemy | Nelio Alves |
Documentação Oficial
- C# Language Reference
- .NET 9 Documentation
- Dependency Injection in .NET
- Configuration in .NET
- Logging in .NET
- Microsoft.Data.SqlClient
- SqlBulkCopy Class
- HttpClient Class
- Clean Architecture (.NET)
- T-SQL Reference
- TRY_CAST
- HASHBYTES (SHA2_256)
- Stored Procedures
- ROW_NUMBER
- Indexes
- Schemas