Sistema completo de ingesta y transformación de datos que automatiza la extracción de datasets desde Kaggle hacia Azure Data Lake Storage (ADLS) y su posterior procesamiento a través de una arquitectura medallion (Bronze-Silver-Gold) usando Azure Data Factory y Databricks.
- 🏗️ Arquitectura
- ✨ Características
- 🔧 Componentes
- ⚙️ Configuración
- 🚀 Uso
- 📊 Pipeline de Datos
- 📔 Transformaciones de Databricks
- 🔒 Seguridad
- 📁 Estructura del Proyecto
- 🤝 Contribución
Este proyecto implementa una arquitectura moderna de ingesta de datos con los siguientes componentes:
- 🔄 Ingesta Automatizada: Extracción de datasets desde Kaggle mediante GitHub Actions
- ☁️ Almacenamiento en la Nube: Integración completa con Azure Data Lake Storage
- 🏗️ Arquitectura Medallion: Procesamiento de datos en capas Bronze, Silver y Gold
- 🔒 Gestión Segura de Credenciales: Uso de Azure Key Vault para secrets
- 📊 Orquestación: Azure Data Factory para coordinación de pipelines
- ⚡ Procesamiento Escalable: Databricks para transformaciones complejas
- 🎯 Formatos Optimizados: Conversión automática de Excel/CSV a Parquet
Script principal en Python que:
- Descarga datasets desde Kaggle API
- Convierte archivos Excel a CSV
- Sube archivos a Azure Data Lake Storage
- Gestiona credenciales de forma segura
Automatización CI/CD que:
- Se ejecuta mediante workflow_dispatch
- Configura el entorno Python
- Ejecuta el ingester con parámetros
- Maneja autenticación con Azure
Orquestador que:
- Dispara GitHub Actions via API
- Mueve datos de Raw a Bronze (CSV → Parquet)
- Ejecuta notebooks de Databricks
- Limpia archivos temporales
Notebooks de PySpark y SQL para procesamiento de datos:
- Bronze: Ingesta inicial con timestamps
- Silver: Limpieza, tipado y enriquecimiento
- Gold: Agregaciones y métricas de negocio
- Seguridad: DDLs y gestión de permisos
- Rollback: Scripts de limpieza y recuperación
Dashboard/Reporte generado en Databricks:
- JSON: Configuración del dashboard de Databricks
- PDF: Reporte exportado con visualizaciones y métricas
- Contenido: Análisis de datos de vuelos, KPIs de aerolíneas y rutas
- Propósito: Presentación ejecutiva de resultados y insights
- Azure Subscription con los siguientes servicios:
- Azure Data Factory
- Azure Data Lake Storage Gen2
- Azure Key Vault
- Azure Databricks
- GitHub Repository con Actions habilitadas
- Kaggle Account con API credentials
kaggle-username # Tu username de Kaggle
kaggle-key # Tu API key de Kaggle
github-token # Personal Access Token de GitHubAZURE_CREDENTIALS # Service Principal JSON
KEYVAULT_URI # https://tu-keyvault.vault.azure.net/
STORAGE_ACCOUNT # Nombre de tu storage account-
Clonar el repositorio:
git clone https://github.com/gquintal/data-ingester-adb.git cd data-ingester-adb -
Crear entorno virtual:
python -m venv venv source venv/bin/activate # En Windows: venv\Scripts\activate
-
Instalar dependencias:
pip install -r kaggle-ingester/requirements.txt
- Ve a la pestaña Actions en tu repositorio
- Selecciona 🔄 Kaggle to ADLS Ingester
- Haz clic en Run workflow
- Especifica los parámetros:
- Dataset:
username/dataset-name(ej:jillanisofttech/flight-price-prediction-dataset) - Container:
raw(o el nombre de tu contenedor)
- Dataset:
- Abre tu instancia de Azure Data Factory
- Navega al pipeline Data Ingester Smart Data
- Ejecuta con parámetros:
{ "dataset": "jillanisofttech/flight-price-prediction-dataset", "container_name": "raw" }
python kaggle-ingester/kaggle-ingester.py \
--dataset "username/dataset-name" \
--keyvault-uri "https://tu-keyvault.vault.azure.net/" \
--storage-account "tu-storage-account" \
--container "raw"El pipeline sigue una arquitectura medallion con las siguientes etapas:
- Formato: CSV/Excel originales
- Propósito: Datos crudos sin procesamiento
- Ubicación:
container/raw/
- Propósito: Datos estructurados, sin transformaciones
- Procesamiento: Conversión de formato, validación básica
- Ubicación:
container/bronze/
- Propósito: Datos limpios y estandarizados
- Procesamiento: Limpieza, deduplicación, tipado
- Ubicación:
container/silver/
- Propósito: Datos listos para análisis
- Procesamiento: Agregaciones, métricas de negocio
- Ubicación:
container/gold/
Objetivo: Ingesta inicial de datos con metadatos
# Principales operaciones:
- Lectura de archivos Parquet desde ADLS
- Agregado de timestamp de ingesta
- Escritura en formato Delta LakeObjetivo: Limpieza y estandarización de datos
# Transformaciones aplicadas:
- Eliminación de duplicados
- Conversión de tipos de datos (fechas, decimales)
- Parsing de duración de vuelos a minutos
- Estandarización de Total_Stops (texto → números)
- Identificación de vuelos directos
- Validación y limpieza de camposCampos procesados:
Date_of_Journey: Conversión a formato DATEDuration: Parsing aDuration_Minutes(entero)Total_Stops: Normalización de texto a númerosPrice: Conversión a DECIMAL(10,2)Is_Direct_Flight: Flag booleano para vuelos sin escalas
Objetivo: Creación de métricas de negocio y dimensiones analíticas
-- Métricas por aerolínea:
- total_flights: Cantidad total de vuelos
- avg_price: Precio promedio
- most_common_route: Ruta más frecuente
- direct_flights_percentage: % de vuelos directos
- avg_stops: Promedio de escalas-- Métricas por ruta:
- total_flights: Vuelos en la ruta
- avg_price, min_price, max_price: Estadísticas de precios
- median_price: Mediana de precios
- avg_stops: Escalas promedio
- airlines_count: Aerolíneas que operan la rutaConfiguración inicial de la base de datos:
- Creación del catálogo
- Definición de esquemas:
bronze,silver,gold - Configuración de tablas Delta con ubicaciones ADLS
- Gestión de permisos para usuarios
Scripts de limpieza y recuperación:
- Eliminación de tablas Delta
- Limpieza de archivos en ADLS
- Recuperación de external locations
- Procedimientos de rollback para desarrollo/testing
- 🔐 Azure Key Vault: Almacenamiento seguro de credenciales
- 🛡️ Managed Identity: Autenticación sin credenciales hardcodeadas
- 🔒 GitHub Secrets: Variables sensibles encriptadas
- 🚫 .gitignore: Exclusión de archivos temporales y credenciales
- ✅ Principio de menor privilegio: Permisos mínimos necesarios
data-ingester-adb/
├── 📂 .github/workflows/
│ └── kaggle-ingest.yml # GitHub Actions workflow
├── 📂 kaggle-ingester/
│ ├── kaggle-ingester.py # Script principal de ingesta
│ └── requirements.txt # Dependencias Python
├── 📂 Data-Ingester-Pipeline/
│ ├── 📂 dataset/
│ │ ├── DS_Source.json # Dataset source definition
│ │ └── DS_Sink.json # Dataset sink definition
│ ├── 📂 linkedService/
│ │ ├── LS_ADLS.json # Azure Data Lake linked service
│ │ ├── LS_AKV.json # Azure Key Vault linked service
│ │ └── LS_Databricks.json # Databricks linked service
│ └── 📂 pipeline/
│ └── Data Ingester Smart Data.json # Main ADF pipeline
├── 📂 transformation/ # Databricks Notebooks
│ ├── 📂 proceso/
│ │ ├── extraction to bronze.py # Bronze layer processing
│ │ ├── transform to silver.py # Silver layer transformations
│ │ └── load to gold.py # Gold layer aggregations
│ ├── 📂 rollback/
│ │ └── Drop.sql # Cleanup and rollback scripts
│ └── 📂 seguridad/
│ └── DDLs.sql # Database schemas and permissions
├── .gitignore # Git ignore patterns
├── README.md # Este archivo
├── Flights Report.lvdash.json # Databricks Dashboard configuration
└── Flights Report.pdf # Dashboard report (exported)
- Trigger: Azure Data Factory inicia el pipeline
- Authentication: Obtiene token de GitHub desde Key Vault
- GitHub Action: Dispara workflow via API
- Download: GitHub Actions descarga dataset de Kaggle
- Upload: Sube archivos CSV a ADLS Raw
- Transform: ADF convierte CSV a Parquet (Bronze)
- Process: Databricks notebooks procesan Silver y Gold
- Cleanup: Elimina archivos temporales
Error de autenticación con Kaggle:
# Verificar que las credenciales están en Key Vault
# Comprobar que el usuario tiene acceso al datasetError de conexión con Azure:
# Verificar que el Service Principal tiene permisos
# Comprobar que el Storage Account existeError en GitHub Actions:
# Verificar que los secrets están configurados
# Comprobar que el workflow tiene permisos- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la licencia MIT. Ver LICENSE para más detalles.
Guadalupe Quintal V
- GitHub: @gquintal
- LinkedIn: Guadalupe Quintal
⭐ ¡Si este proyecto te fue útil, considera darle una estrella!
📧 Para preguntas o sugerencias, no dudes en abrir un issue.
