Saltar al contenido

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 optimizada
2create_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 DATE
10)
11DISTKEY(customer_id) -- JOINs con tabla clientes serán locales
12SORTKEY(order_date) -- Filtros por fecha saltan bloques irrelevantes
13;
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 Redshift
2copy_sql = """
3COPY ventas
4FROM 's3://fashionstore-datalake/processed/ventas/'
5IAM_ROLE 'arn:aws:iam::123456789:role/RedshiftLoadRole'
6FORMAT AS PARQUET;
7"""
8
9# Mejores prácticas para COPY:
10# 1. Divide archivos en múltiples (1 por nodo slice)
11# 2. Usa Parquet o CSV comprimido
12# 3. Usa manifests para control preciso
13# 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.

Cada slice del clúster lee un archivo — la carga es completamente paralela

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

[01]

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.

Cargando editor...
[02]

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.

Cargando editor...
[03]

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)
Cargando editor...
[04]

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.

Cargando editor...

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...