Un pipeline de datos confiable no es el que nunca falla, es el que falla de forma visible y recuperable. Estos son los principios que sigo al diseñarlos.
1. Validar en la frontera, no en el medio
Cada fuente externa (APIs, exports de terceros, cargas manuales) debe pasar por una validación de esquema apenas entra al pipeline. Si el dato tarda tres pasos en fallar, el error es mucho más caro de diagnosticar.
2. Idempotencia primero
Toda tarea del pipeline debe poder reintentarse sin duplicar datos. Un ejemplo simple: usar MERGE/upsert en vez de INSERT puro.
def upsert_batch(rows, table, key_columns):
"""Inserta o actualiza sin duplicar, usando las columnas clave."""
for row in rows:
table.merge(row, on=key_columns)
3. El costo de una transformación mal medida
Si es el número de filas y una transformación tiene costo por una unión mal indexada, el tiempo de ejecución crece así:
Duplicar el volumen de datos () no duplica el tiempo de proceso — lo multiplica por cuatro. Por eso perfilar antes de escalar importa más que agregar cómputo.
En resumen
- Falla rápido y en un solo lugar.
- Diseña para reintentos, no para "que no falle nunca".
- Mide la complejidad real de tus transformaciones antes de escalar infraestructura.