ETL vs ELT: Eligiendo la Arquitectura Correcta
La decision entre ETL y ELT impacta directamente en costos, velocidad de desarrollo y escalabilidad. En Latinoamerica, la tendencia clara es hacia ELT gracias a data warehouses cloud como BigQuery y Snowflake.
| Aspecto | ETL Tradicional | ELT Moderno |
|---|---|---|
| Transformacion | Antes de cargar | Despues de cargar (en warehouse) |
| Escalabilidad | Limitada por servidor ETL | Ilimitada (warehouse escala) |
| Costo | Infraestructura propia | Pay-per-query (cloud) |
| Velocidad dev | Lento (Java/Scala) | Rapido (SQL + dbt) |
| Herramientas | Informatica, Talend, SSIS | Fivetran + dbt + BigQuery |
Capas del Data Warehouse
Raw/Bronze: Datos crudos sin transformaciones.
Staging/Silver: Datos limpiados y tipados.
Marts/Gold: Modelos dimensionales para consumo.
import httpx
import polars as pl
import boto3
class APIExtractor:
def __init__(self, base_url, api_key):
self.client = httpx.Client(
base_url=base_url,
headers={'Authorization': f'Bearer {api_key}'},
timeout=30.0
)
def extract_paginated(self, endpoint, date_from, date_to):
all_records = []
page = 1
while True:
resp = self.client.get(endpoint, params={
'date_from': date_from, 'date_to': date_to,
'page': page, 'per_page': 1000
})
resp.raise_for_status()
records = resp.json().get('results', [])
if not records: break
all_records.extend(records)
page += 1
return all_records
def load_to_s3(self, records, bucket, key):
df = pl.DataFrame(records)
buf = df.write_parquet(None)
boto3.client('s3').put_object(Bucket=bucket, Key=key, Body=buf)
return len(records)🚀 Stack Recomendado
Para startups LATAM: Airbyte (extraccion, open source) + BigQuery (warehouse, free tier generoso) + dbt (transformaciones) + Metabase (dashboards). Costo total: ~USD 50/mes para empezar.
Con estos patrones dominados, pasemos a dbt, la herramienta que revoluciono las transformaciones.