lección 2
Zonas del lago: raw, silver y gold — del caos al orden
La arquitectura medallion que convierte el caos del data lake en un sistema organizado con capas de calidad creciente.
⏱ 55 min
En la lección anterior vimos cómo el data lake resolvió el problema de almacenamiento pero creó uno nuevo: el pantano. Datos sin orden, sin calidad, sin documentación. La solución que la industria encontró — y que hoy es prácticamente un estándar — es dividir el lago en zonas con niveles crecientes de calidad y estructura. Es lo que Databricks popularizó como "arquitectura medallion" (bronce, plata, oro), aunque la idea existía antes con otros nombres.
La analogía perfecta es una planta de tratamiento de agua. El agua llega del río (sucia, con sedimentos, sin tratar), pasa por filtros sucesivos (sedimentación, cloración, purificación), y sale por el grifo lista para beber. No te bebes el agua del río directamente, ¿verdad? Con los datos pasa exactamente lo mismo.
### Zona Raw (Bronze): la verdad sin filtros
La zona raw es sagrada. Es la copia exacta, bit a bit, de lo que llegó de la fuente. No se transforma, no se limpia, no se modifica. ¿Por qué? Porque si cometes un error en el procesamiento posterior, siempre puedes volver a los datos originales y reprocesar. Es tu "copia de seguridad inmutable". He visto equipos que transformaban datos al entrar y perdían información que luego resultó ser crucial.
- Formato: el mismo que la fuente. Si llega como JSON, se guarda como JSON. Si llega como CSV, se guarda como CSV.
- Estructura: carpetas organizadas por fuente y fecha de llegada (ej: raw/ventas/2024/01/15/)
- Retención: se guarda TODO, indefinidamente (o con política de retención larga, 1-3 años)
- Acceso: solo el equipo de data engineering. Nadie más debería leer de aquí directamente.
- Garantía: inmutabilidad — una vez escrito, nunca se modifica ni se borra (append-only).
Regla de oro que aprendí a golpes: NUNCA modifiques raw. Ni para corregir un typo. Si el archivo fuente tiene un error, lo documentas y lo corriges en silver. Raw es tu máquina del tiempo — siempre puedes volver ahí. La única excepción es legal: si un usuario ejerce su derecho al olvido (GDPR), estás obligado a borrar sus datos personales incluso de raw. En las lecciones 6 y 7 verás los mecanismos que lo hacen posible sin romper el lake: reescritura con DELETE + expiración de snapshots + limpieza de ficheros huérfanos.
### Zona Silver (Processed): limpieza y conformidad
La zona silver es donde ocurre la magia de la ingeniería de datos. Aquí tomas los datos crudos de raw y les aplicas transformaciones de calidad: limpias nulos, corriges tipos, deduplicas registros, validas formatos, y — muy importante — conviertes todo a un formato analítico eficiente como Parquet.
- Conversión de formato: de JSON/CSV (raw) a Parquet (silver). Reduce tamaño 10-17× (medido: un CSV de 221 MB se queda en 13 MB de Parquet). Y las queries van entre 6× y 600× más rápido, dependiendo de cuántas columnas leas — Parquet gana en proporción a las columnas que NO necesitas.
- Tipado correcto: las fechas son fechas (no strings), los números son números.
- Deduplicación: eliminar registros duplicados que llegaron por reintentos.
- Validación de nulls: marcar o filtrar registros con campos obligatorios vacíos.
- Normalización: formatos consistentes de nombres, fechas, monedas.
- Añadir metadatos: fecha de procesamiento, hash del archivo fuente, versión del pipeline.
1import pandas as pd2from datetime import datetime34# Pipeline raw → silver para datos de ventas5ventas_raw = pd.read_json("raw/ventas/2024/01/15/ventas.json")67ventas_silver = (8 ventas_raw9 .assign(10 fecha_venta=lambda df: pd.to_datetime(df['fecha_venta']),11 importe=lambda df: pd.to_numeric(df['importe'], errors='coerce'),12 cliente_id=lambda df: df['cliente_id'].astype(str).str.strip(),13 )14 .drop_duplicates(subset=['pedido_id'])15 .dropna(subset=['pedido_id', 'cliente_id', 'importe'])16 .query("importe > 0 and importe < 1_000_000")17 .assign(18 _procesado_en=datetime.now(),19 _fuente="raw/ventas/2024/01/15/ventas.json",20 )21)2223ventas_silver.to_parquet(24 "silver/ventas/fecha=2024-01-15/ventas.parquet",25 index=False26)27print(f"Raw: {len(ventas_raw)} filas → Silver: {len(ventas_silver)} filas")
Pipeline típico de raw a silver: limpiar, tipar, deduplicar y guardar en Parquet
### Zona Gold (Curated): lista para negocio
La zona gold es el escaparate. Aquí los datos están modelados para responder preguntas de negocio específicas. Son las tablas que leen los analistas, los dashboards, los modelos de ML. Gold NO es un volcado limpio de silver — es una reorganización orientada al consumidor.
Ejemplos de lo que encuentras en gold: una tabla de métricas diarias agregada por producto y canal (para el dashboard del CEO), una tabla de segmentos de cliente (para marketing), una feature store con variables calculadas (para ML). Gold suele tener esquema estrella — hechos y dimensiones, como lo que aprendiste en la Skill 11.
### Reglas prácticas por zona
Después de implementar esta arquitectura en más de 10 empresas, estas son las reglas que siempre repito a los equipos:
- 01.Raw es append-only. Nunca borras, nunca modificas. Si el disco es caro, mueves a Glacier después de 90 días, pero no borras.
- 02.Silver tiene un dueño claro. Cada tabla silver tiene un pipeline responsable y un contrato de datos (columnas, tipos, SLA de frescura).
- 03.Gold se diseña CON el consumidor. No crees tablas gold "por si acaso". Pregunta al analista qué necesita y construye desde ahí.
- 04.Los metadatos son obligatorios. Cada archivo debe tener: fecha de creación, pipeline que lo generó, versión del esquema, y hash de los datos fuente.
- 05.El linaje debe ser trazable. Desde cualquier dato en gold, debes poder llegar al archivo raw original que lo generó.
Error que he visto en 3 empresas distintas: crear 50 tablas gold "porque algún día alguien las necesitará". Resultado: nadie sabe cuál usar, varias muestran números distintos para la misma métrica, y la confianza en los datos se destruye. Menos es más en gold.
### Convenciones de nombres y paths
En un data lake basado en S3 (o cualquier object storage), la organización se hace por prefijos de path. Hay un estándar de facto que todo el mundo sigue:
1# Patrón de rutas en el lake2s3://mi-empresa-lake/3 raw/4 {fuente}/{año}/{mes}/{día}/{archivo}5 ventas/2024/01/15/ventas_20240115_001.json6 logs/2024/01/15/access_log_20240115.gz7 silver/8 {dominio}/fecha={YYYY-MM-DD}/{archivo.parquet}9 ventas/fecha=2024-01-15/part-00000.parquet10 clientes/fecha=2024-01-15/part-00000.parquet11 gold/12 {caso_uso}/{archivo.parquet}13 metricas_diarias/fecha=2024-01-15/metricas.parquet14 segmentos_cliente/segmentos_v3.parquet
Estructura de paths en S3 siguiendo la arquitectura medallion
Consejo que me habría ahorrado meses de trabajo: usa SIEMPRE formato fecha ISO (YYYY-MM-DD) en los paths y particiones. Nunca DD/MM/YYYY ni MM-DD-YYYY. El ordenamiento lexicográfico de ISO coincide con el cronológico. Parece obvio pero he visto lakes con 3 formatos de fecha diferentes.
### Cuándo usar una zona intermedia extra
Algunas empresas añaden una cuarta zona — a veces llamada "staging" o "landing" — antes de raw. ¿Cuándo tiene sentido? Cuando los datos llegan de fuentes externas poco confiables (APIs de terceros, FTP compartidos, scraping). La zona landing es temporal: los datos aterrizan ahí, se valida que el archivo no está corrupto y que tiene el formato esperado, y solo entonces pasan a raw. Si falla la validación, se mueven a una zona de "quarantine" para revisión manual.
Dicho esto, no añadas complejidad innecesaria. Para la mayoría de empresas, tres zonas (raw/silver/gold) son suficientes. Añade una cuarta solo si tienes un problema real de datos corruptos entrando.
## ejercicios
Clasificar datasets por zona
Te dan una lista de datasets de un e-commerce. Clasifica cada uno en la zona correcta (raw, silver o gold) y explica por qué.
💡 Resultado esperado
1. [RAW] Archivo JSON descargado de la API de Stripe (pagos) Razón: Formato original de la fuente, sin transformar 2. [SILVER] Tabla de ventas con fechas como datetime y sin duplicados
Pipeline raw → silver de eventos
La app móvil envía eventos JSON con estructura variable. Escribe un pipeline que lea raw, limpie los datos y guarde en silver como Parquet.
💡 Resultado esperado
Raw: 6 eventos Silver: 3 eventos
Generar tabla gold de métricas diarias
A partir de datos silver de ventas, genera una tabla gold con métricas diarias que el CEO pueda ver en su dashboard.
💡 Resultado esperado
=== GOLD: Métricas Diarias ===
fecha total_ventas num_pedidos ticket_medio clientes_unicos canal_top
2024-01-15 575 5 115.00 4 web
2024-01-16 290 3 96.67 3 appValidar la transición entre zonas
Escribe funciones que validen si un DataFrame cumple los requisitos para pasar de una zona a otra. El pipeline debe rechazar datos que no cumplan.
💡 Resultado esperado
Datos buenos: {'valido': True, 'errores': []}
Datos malos: {'valido': False, 'errores': ["Columnas faltantes: ['email']", "'id' tiene 20% nulls (máx 10%)", "'nombre' tiene 80% nulls (máx 10%)", 'Hay 40% duplicados (máx 5%)']}Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...