lección 8
Redshift: el warehouse columnar de AWS
Cuándo Redshift vs Athena, arquitectura columnar, distribution keys, sort keys, COPY command y estrategias de carga masiva.
⏱ 55 min
Athena es genial para consultas ad-hoc sobre tu data lake. Pero cuando tienes 50 analistas lanzando queries al mismo tiempo, dashboards que se actualizan cada 5 minutos, y la gerencia exige latencia de subsegundo en sus reportes, necesitas algo más. Necesitas un data warehouse dedicado. Ahí entra Redshift.
Redshift es un data warehouse columnar gestionado por AWS. "Columnar" significa que almacena los datos por columna en vez de por fila — exactamente como Parquet pero en un motor SQL completo. Esto hace que las queries analíticas (que típicamente leen pocas columnas pero muchas filas) sean extremadamente rápidas.
### Athena vs Redshift: la decisión de arquitectura
- Athena: pago por query, sin infra, ideal para < 50 queries/día, exploración, datos fríos.
- Redshift: coste fijo mensual, latencia predecible, ideal para dashboards, > 100 queries/día, concurrencia alta.
- Redshift Serverless: punto medio — pago por uso pero con rendimiento de Redshift.
- Regla: si el coste de Athena supera el de un clúster Redshift pequeño, migra a Redshift.
### Distribution keys: cómo Redshift reparte datos
Redshift distribuye filas entre nodos según una "distribution key". Si eliges bien, los JOINs se resuelven localmente en cada nodo (sin network shuffle). Si eliges mal, Redshift tiene que mover datos entre nodos para cada JOIN — lo que mata el rendimiento.
- KEY distribution: elige una columna frecuente en JOINs (ej: customer_id). Filas con mismo valor van al mismo nodo.
- EVEN distribution: reparte uniformemente. Bueno para tablas de hechos grandes sin JOINs frecuentes.
- ALL distribution: copia la tabla COMPLETA en cada nodo. Solo para dimensiones pequeñas (< 2M filas).
### Sort keys: ordenar para acelerar filtros
Los sort keys determinan el orden físico de los datos en disco. Si casi siempre filtras por fecha, haz que date sea tu sort key. Redshift sabe que los bloques están ordenados y puede saltar bloques enteros que no cumplen el filtro (zone maps). Es como tener un índice gratuito.
1# Ejemplo conceptual: crear tabla Redshift optimizada2create_table_sql = """3CREATE TABLE ventas (4 order_id VARCHAR(36),5 customer_id VARCHAR(36),6 product_id VARCHAR(36),7 quantity INTEGER,8 amount DECIMAL(10,2),9 order_date DATE10)11DISTKEY(customer_id) -- JOINs con tabla clientes serán locales12SORTKEY(order_date) -- Filtros por fecha saltan bloques irrelevantes13;14"""15print(create_table_sql)16print("DISTKEY + SORTKEY = la diferencia entre query de 30s y query de 0.3s")
DISTKEY para JOINs eficientes, SORTKEY para filtros rápidos
### COPY command: carga masiva desde S3
La forma más eficiente de cargar datos en Redshift es el comando COPY, que lee directamente de S3 en paralelo. Cada nodo del clúster lee su porción de archivos simultáneamente. COPY es órdenes de magnitud más rápido que INSERT fila a fila.
1# COPY command: cargar Parquet desde S3 a Redshift2copy_sql = """3COPY ventas4FROM 's3://fashionstore-datalake/processed/ventas/'5IAM_ROLE 'arn:aws:iam::123456789:role/RedshiftLoadRole'6FORMAT AS PARQUET;7"""89# Mejores prácticas para COPY:10# 1. Divide archivos en múltiples (1 por nodo slice)11# 2. Usa Parquet o CSV comprimido12# 3. Usa manifests para control preciso13# 4. Evita archivos > 1GB (divide en 100-500MB)14print(copy_sql)
COPY lee de S3 en paralelo — es la forma correcta de cargar datos en Redshift
Consejo de senior: la regla de oro de Redshift es que el número de archivos en S3 debe ser múltiplo del número de slices del clúster. Un clúster dc2.large de 2 nodos tiene 4 slices, así que divide tus datos en 4, 8 o 12 archivos. Así cada slice lee la misma cantidad y no hay slices ociosos esperando.
Redshift no es una base de datos transaccional. No lo uses para cargas INSERT/UPDATE fila a fila ni para servir APIs con consultas de baja latencia. Para eso usa DynamoDB o RDS. Redshift es para ANÁLISIS: queries complejas sobre muchos datos, no operaciones CRUD unitarias.
Consejo de senior: usa Redshift Spectrum si quieres lo mejor de ambos mundos. Spectrum permite a Redshift consultar datos en S3 directamente (como Athena) pero combinándolos con datos locales de Redshift en la misma query. Datos calientes en Redshift, datos fríos en S3, una sola consulta.
## ejercicios
Diseñar tabla Redshift optimizada
Diseña el DDL de una tabla de ventas en Redshift eligiendo DISTKEY y SORTKEY óptimos para un escenario donde las queries más frecuentes filtran por fecha y hacen JOIN con clientes.
Generar COPY con manifest
Crea una función que genere un manifest JSON para COPY y el comando SQL correspondiente, controlando exactamente qué archivos se cargan.
Analizar patrón de queries para elegir DISTKEY
Dado un log de queries frecuentes, analiza los JOINs y filtros para recomendar la DISTKEY y SORTKEY óptimas.
💡 Resultado esperado
DISTKEY recomendada: id (usada en 3 JOINs) SORTKEY recomendada: order_date (usada en 4 filtros)
Diseñar query Redshift Spectrum (local + S3)
Diseña una query que combine datos locales de Redshift (ventas recientes) con datos históricos en S3 via Spectrum.
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...