Plataformas de datos Medio¶
Dónde y cómo se almacenan los datos para analizarlos: informes, BI, ciencia de datos, entrenamiento de modelos.
1. OLTP vs. OLAP¶
| OLTP (transaccional) | OLAP (analítico) | |
|---|---|---|
| Uso | Operar el negocio: crear un pedido, actualizar un nodo | Analizar: ¿cuántos fallos por región este trimestre? |
| Consultas | Muchas, pequeñas, por clave | Pocas, enormes, agregaciones sobre millones de filas |
| Almacenamiento | Por filas | Por columnas |
| Esquema | Normalizado | Desnormalizado (estrella) |
| Ejemplos | PostgreSQL, MySQL | BigQuery, Snowflake, Redshift, ClickHouse, Databricks |
¿Por qué columnar?¶
Una consulta analítica lee pocas columnas de muchas filas (SELECT region, avg(cpu) FROM telemetria). Guardando cada
columna junta, solo se leen del disco las columnas usadas, y los valores parecidos juntos comprimen muchísimo mejor.
2. Modelado analítico: esquema en estrella¶
flowchart TB
F[("Tabla de hechos<br/>fact_deployment<br/>site_key, date_key, version_key,<br/>duration_s, success")]
D1[dim_site<br/>región, país, tipo de hardware] --- F
D2[dim_date<br/>día, mes, trimestre] --- F
D3[dim_version<br/>versión, fecha de release] --- F
- Hechos: eventos medibles (un despliegue, con su duración y resultado). Muchas filas.
- Dimensiones: el contexto por el que se filtra y agrupa (sitio, fecha, versión). Pocas filas, muchos atributos.
- Dimensiones que cambian (slowly changing dimensions): si un sitio cambia de región, ¿se reescribe (tipo 1) o se guarda el histórico con fechas de validez (tipo 2)?
3. Evolución: warehouse → lake → lakehouse¶
| Arquitectura | Idea | Pros | Contras |
|---|---|---|---|
| Data warehouse | Base de datos analítica con esquema definido | SQL rápido, gobierno, calidad | Caro, poco flexible, datos no estructurados fuera |
| Data lake | Ficheros de todo tipo en almacenamiento de objetos (S3, ADLS, GCS) | Barato, flexible, cualquier dato | Sin transacciones ni esquema → "pantano de datos" |
| Lakehouse | Ficheros abiertos en el lake + formato de tabla que añade transacciones, esquema y versiones | Lo mejor de ambos, formatos abiertos, varios motores sobre los mismos datos | Más piezas que integrar |
Formatos¶
| Capa | Opciones | Qué aporta |
|---|---|---|
| Fichero | Parquet, ORC | Columnar, comprimido, con estadísticas por bloque |
| Tabla | Apache Iceberg, Delta Lake, Apache Hudi | Transacciones ACID, evolución de esquema, time travel (consultar una versión pasada), particionado oculto |
| Catálogo | Glue, Unity Catalog, Polaris, Nessie | Dónde están las tablas y quién puede acceder |
| Motor | Spark, Trino, Flink, DuckDB, BigQuery, Snowflake | Leen y escriben las mismas tablas |
Iceberg como estándar de facto
Los grandes proveedores soportan Iceberg (tablas S3 en AWS, BigLake en Google, Snowflake, Databricks): tus datos quedan en un formato abierto y puedes cambiar de motor sin migrarlos.
4. ETL vs. ELT¶
| ETL | ELT | |
|---|---|---|
| Orden | Extraer → transformar fuera → cargar | Extraer → cargar en bruto → transformar dentro del warehouse |
| Dónde se transforma | Servidor o herramienta de ETL | En el propio motor analítico (SQL) |
| Tendencia | Clásico | Actual: el cómputo analítico es barato y escalable |
Capas (arquitectura medallón)¶
| Capa | Contenido |
|---|---|
| Bronce | Datos en bruto tal como llegan (auditables, reprocesables) |
| Plata | Limpios, deduplicados, tipados, unidos |
| Oro | Agregados listos para negocio (métricas, tablas para dashboards) |
dbt¶
Herramienta para escribir las transformaciones como SQL versionado, con dependencias entre modelos, tests de datos y documentación generada: aplica prácticas de ingeniería de software al análisis.
-- models/gold/deployments_by_region.sql
select
s.region,
date_trunc('day', d.started_at) as day,
count(*) as deployments,
avg(case when d.success then 1 else 0 end) as success_rate
from {{ ref('silver_deployments') }} d
join {{ ref('silver_sites') }} s on s.site_id = d.site_id
group by 1, 2
# models/gold/schema.yml — tests de datos que se ejecutan en CI
models:
- name: deployments_by_region
columns:
- name: region
tests: [not_null]
- name: success_rate
tests:
- dbt_utils.accepted_range: { min_value: 0, max_value: 1 }
5. Orquestación¶
Los pipelines de datos tienen dependencias ("el modelo oro necesita que termine la carga de plata"). Orquestadores: Airflow, Dagster, Prefect, Argo Workflows (en Kubernetes), y los servicios de cada nube.
6. Organización: data mesh y contratos de datos¶
- Data mesh: en lugar de un equipo central de datos que se convierte en cuello de botella, cada dominio publica sus datos como un producto (con dueño, documentación, calidad y SLA), sobre una plataforma común de autoservicio y con gobierno federado. Es DDD aplicado a los datos.
- Contratos de datos: acuerdo explícito (esquema, semántica, calidad, frecuencia) entre quien produce y quien consume datos, validado automáticamente. Evita que un cambio en la aplicación rompa silenciosamente los informes.
7. Calidad y gobierno¶
| Tema | Prácticas |
|---|---|
| Calidad | Tests (nulos, unicidad, rangos, frescura), alertas cuando fallan |
| Linaje | Saber de dónde viene cada dato y qué depende de él (OpenLineage) |
| Catálogo | Qué datos existen, qué significan, quién es el dueño |
| Acceso | Permisos por columna/fila, enmascarado de datos personales |
| Privacidad | Minimización, retención, derecho al olvido (difícil en ficheros inmutables: los formatos de tabla ayudan con borrados) |
Preguntas de repaso¶
¿Por qué el almacenamiento columnar acelera las consultas analíticas?
Porque solo lee las columnas que usa la consulta y comprime mucho mejor valores del mismo tipo juntos; además permite procesar vectores de valores de una columna a la vez.
¿Qué aporta un formato de tabla como Iceberg sobre ficheros Parquet sueltos?
Transacciones atómicas (lectores nunca ven escrituras a medias), evolución de esquema, time travel, particionado gestionado y la posibilidad de que varios motores lean y escriban las mismas tablas de forma segura.
¿ETL o ELT hoy?
Normalmente ELT: cargar en bruto al lakehouse o warehouse y transformar con SQL (dbt) aprovechando su escala. ETL sigue teniendo sentido para anonimizar antes de cargar o con volúmenes que conviene reducir en origen.
Ejercicios¶
Ejercicio 1 · Básico — Hechos y dimensiones
Quieres analizar incidentes de la flota por región, tipo de hardware, severidad y mes, con su tiempo de resolución. Define la tabla de hechos y las dimensiones.
Solución
Hechos: fact_incident(incident_id, site_key, date_key, severity_key, hardware_key, resolution_minutes, reopened).
Dimensiones: dim_site (código, región, país), dim_date (día, mes, trimestre, año), dim_severity (nivel,
descripción), dim_hardware (modelo, fabricante, generación). Las métricas numéricas (tiempo de resolución) van en
los hechos; los atributos por los que agrupas, en las dimensiones.
Ejercicio 2 · Medio — Diseñar el pipeline de telemetría
La telemetría de 20 000 sitios llega a Kafka (5 000 eventos/s). Negocio quiere un dashboard diario de disponibilidad por región y ciencia de datos quiere el histórico en bruto para entrenar modelos. Diseña la plataforma.
Solución
- Ingesta: Kafka Connect (sink de Iceberg) o Flink escribe los eventos en una tabla Iceberg bronce particionada por día, en almacenamiento de objetos.
- Plata: trabajo (Spark o dbt sobre un motor SQL) que limpia, deduplica por
eventIdy normaliza. - Oro: modelo dbt
availability_by_region_dayque alimenta el dashboard. - Ciencia de datos lee bronce/plata directamente con su motor (Spark, DuckDB) gracias al formato abierto.
- Orquestación diaria (Airflow/Dagster), tests de dbt, retención del bronce según coste (p. ej. 13 meses) y clases de almacenamiento frías para lo antiguo.
Ejercicio 3 · Medio — Dimensión que cambia
Un sitio se traslada de la región "norte" a "centro" en marzo. Los informes de enero deben seguir mostrándolo en "norte". ¿Cómo lo modelas?
Solución
Dimensión de tipo 2: cada cambio crea una nueva fila en dim_site con valid_from, valid_to y
is_current, y una clave sustituta (site_key) distinta. Los hechos de enero apuntan a la fila antigua ("norte") y
los de abril a la nueva ("centro"). Para "estado actual" se filtra is_current = true.
Ejercicio 4 · Avanzado — Contrato de datos
El equipo de la API de despliegues renombra el campo status a state y el dashboard de negocio se rompe una semana
sin que nadie lo note. Propón un mecanismo para que no vuelva a pasar.
Solución
Un contrato de datos versionado junto al productor (esquema, significado de cada campo, valores permitidos, frescura esperada) y validación automática en tres puntos: (1) en el CI del productor, un test que compara el esquema publicado con el contrato y falla ante cambios incompatibles; (2) en el Schema Registry, compatibilidad backward obligatoria; (3) en la plataforma de datos, tests de dbt y de frescura con alertas al dueño. Los cambios incompatibles se hacen con una versión nueva y periodo de convivencia.