AWS Data Engineering Bootcamp explicado de forma sencilla (con diagramas y código real)
AWS Data Engineering Bootcamp : lo esencial en un artículo — código real, diagramas y pasos concretos, extractos de un curso de 17 lecciones.
Una guía que va al grano: AWS Data Engineering Bootcamp diseccionada con diagramas, ejemplos concretos y comandos probados. Todo proviene de un curso estructurado de 5 capítulos — aquí lo mejor.
- Introducción a la Ingeniería de Datos AWS
- Particionamiento y Bucketización
- Athena y Glue en Acción
- Cardinalidad y Optimización Avanzada
- Laboratorio guiado de Athena
Capítulo 02 – Lección 3 : Optimización mediante Bucketización y Particionamiento en Athena
Optimización mediante Bucketización en Athena
¿Por qué la Bucketización?
El bucketing distribuye los datos en varios archivos según una clave de hash. Mejora considerablemente el rendimiento cuando se trabaja con columnas de alta cardinalidad.
Reducir el escaneo
Athena solo apunta a los buckets necesarios durante una consulta.
Mejorar las uniones
Cuando dos tablas están bucketizadas con la misma clave, Athena realiza "bucket joins" muy rápidos.
Alta cardinalidad
Ideal para user_id, transaction_id, device_id.
Ejemplo Práctico : Transacciones E-Commerce Bucketizadas
-- Paso 1 : Configurar el bucketing al crear la tabla
-- Reemplaza user_id por tu columna de alta cardinalidad
CLUSTERED BY (user_id) INTO 8 BUCKETS
-- Ejemplo completo con CTAS (Create Table As Select)
CREATE TABLE taxidata.transactions_bucketized
WITH (
format = 'PARQUET',
external_location = 's3://mon-bucket/transactions-bucketized/',
bucketed_by = ARRAY['user_id'],
bucket_count = 8
) AS
SELECT *
FROM taxidata.transactions_source;s3://mon-bucket/transactions-bucketized/ ├── 000000_0.parquet ├── 000001_0.parquet ├── ... └── 000007_0.parquet
Pasos para Configurar el Bucketing
Optimización mediante Particionamiento en Athena
Estructura de las Particiones en S3
El particionamiento organiza los datos en directorios distintos en S3 según los valores de una columna de baja cardinalidad :
# Estructura de las particiones en S3 (formato Hive)
s3://taxi-datalake/yellow/
├── year=2015/month=01/
│ └── data.parquet
├── year=2015/month=02/
│ └── data.parquet
├── year=2016/month=01/
│ └── data.parquet
└── year=2017/month=01/
└── data.parquetCrear una Tabla Particionada mediante CTAS
-- CTAS (Create Table As Select) con particionamiento
-- Conversión CSV → Parquet CON particionamiento
CREATE TABLE taxidata.yellow_partitioned
WITH (
format = 'PARQUET',
external_location = 's3://taxi-datalake/yellow-partitioned/',
partitioned_by = ARRAY['year', 'month']
) AS
SELECT
vendor, pickup, dropoff, count,
distance, ratecode, storeflag, pulocid, dolocid,
paytype, fare, extra, mta_tax, tip, tolls, surcharge, total,
YEAR(pickup) AS year,
MONTH(pickup) AS month
FROM taxidata.yellow;year, month) deben listarse en último lugar en el SELECT y en la matriz partitioned_by.Descubrir las Particiones
-- Tras añadir datos, descubrir las nuevas particiones MSCK REPAIR TABLE taxidata.yellow_partitioned; -- Añadir manualmente una partición específica ALTER TABLE taxidata.yellow_partitioned ADD PARTITION (year='2017', month='02') LOCATION 's3://taxi-datalake/yellow-partitioned/year=2017/month=02/';
Consultas Optimizadas con el Particionamiento
-- Consulta SIN particionamiento : escaneo de TODA la tabla SELECT COUNT(*), SUM(fare) AS total_fares FROM taxidata.yellow WHERE YEAR(pickup) = 2017 AND MONTH(pickup) = 1; -- → Escaneo : 100% de los datos (ej: 1 TB) -- Consulta CON particionamiento : escaneo solo de la partición correspondiente SELECT COUNT(*), SUM(fare) AS total_fares FROM taxidata.yellow_partitioned WHERE year = 2017 AND month = 1; -- → Escaneo : ~1/36 de los datos (si 3 años × 12 meses) -- → ¡Reducción de ~97% de los datos escaneados!
Combinación Óptima : Particionamiento + Bucketización
Capítulo 02 – Lección 2 : Configurar Athena y Crear una Base de Datos Glue
Paso 1 — Configurar el Entorno Athena
# Alternativa : configurar mediante AWS CLI
aws athena update-work-group \
--work-group primary \
--configuration-updates "ResultConfigurationUpdates={OutputLocation=s3://mon-bucket-athena-results/}"Paso 2 — Crear una Base de Datos Glue
En el editor de Athena, ejecuta :
-- Crear la base de datos taxidata en AWS Glue Data Catalog CREATE DATABASE taxidata;
taxidata en AWS Glue Data Catalog. Puedes verla en la consola de Glue bajo "Databases".# Verificar la creación mediante AWS CLI aws glue get-database --name taxidata # Listar todas las bases de datos aws glue get-databases
Paso 3 — Definir el Esquema de la Tabla (Dataset Taxis NYC)
Creamos la tabla externa yellow sobre los datos de taxis de Nueva York almacenados en S3 :
-- Crear la tabla externa yellow sobre los datos S3
CREATE EXTERNAL TABLE IF NOT EXISTS taxidata.yellow (
`vendor` string,
`pickup` timestamp,
`dropoff` timestamp,
`count` int,
`distance` int,
`ratecode` string,
`storeflag` string,
`pulocid` string,
`dolocid` string,
`paytype` string,
`fare` decimal,
`extra` decimal,
`mta_tax` decimal,
`tip` decimal,
`tolls` decimal,
`surcharge` decimal,
`total` decimal
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = ',',
'field.delim' = ','
) LOCATION 's3://aws-tc-largeobjects/CUR-TF-200-ACDSCI-1/Lab2/yellow/'
TBLPROPERTIES ('has_encrypted_data'='false');CREATE EXTERNAL TABLE— la tabla apunta a S3, Athena no copia los datosLazySimpleSerDe— serializador/deserializador para archivos CSV delimitadosfield.delim = ','— los campos están separados por comasLOCATION— ruta S3 que contiene los archivos de datoshas_encrypted_data='false'— los datos no están cifrados
Paso 4 — Previsualizar los Datos
-- Previsualizar las 10 primeras filas SELECT * FROM taxidata.yellow LIMIT 10; -- Contar el número total de trayectos SELECT COUNT(*) AS total_trayectos FROM taxidata.yellow; -- Verificar los tipos de pago disponibles SELECT DISTINCT paytype, COUNT(*) AS nb_trayectos FROM taxidata.yellow GROUP BY paytype ORDER BY nb_trayectos DESC;
Paso 5 — Crear una Tabla Optimizada (Enero 2017)
-- Crear una tabla para los datos de enero de 2017 únicamente
-- Más rápida para pruebas y validación
CREATE EXTERNAL TABLE IF NOT EXISTS taxidata.jan (
`vendor` string,
`pickup` timestamp,
`dropoff` timestamp,
`count` int,
`distance` int,
`ratecode` string,
`storeflag` string,
`pulocid` string,
`dolocid` string,
`paytype` string,
`fare` decimal,
`extra` decimal,
`mta_tax` decimal,
`tip` decimal,
`tolls` decimal,
`surcharge` decimal,
`total` decimal
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = ',',
'field.delim' = ','
) LOCATION 's3://aws-tc-largeobjects/CUR-TF-200-ACDSCI-1/Lab2/January2017/'
TBLPROPERTIES ('has_encrypted_data'='false');Capítulo 03 – Lección 1 : Vistas SQL, Consultas Nombradas y AWS CloudFormation
Las Vistas SQL en Athena
Una vista SQL es una consulta guardada que puedes usar como una tabla. No almacena datos — ejecuta la consulta subyacente en cada llamada.
Ejemplo 1 : Vista de los Trayectos por Tarjeta de Crédito
-- Crear una vista para los pagos con tarjeta de crédito
-- paytype = '1' significa pago con tarjeta
CREATE VIEW taxidata.cctrips AS
SELECT
vendor,
SUM(fare) AS total_fares_cc,
COUNT(*) AS nb_trayectos_cc,
AVG(fare) AS tarifa_media_cc
FROM taxidata.yellow
WHERE paytype = '1'
GROUP BY vendor;
-- Usar la vista
SELECT * FROM taxidata.cctrips;Ejemplo 2 : Vista de los Trayectos en Efectivo
-- Crear una vista para los pagos en efectivo
-- paytype = '2' significa pago en efectivo
CREATE VIEW taxidata.cashtrips AS
SELECT
vendor,
SUM(fare) AS total_fares_cash,
COUNT(*) AS nb_trayectos_cash,
AVG(fare) AS tarifa_media_cash
FROM taxidata.yellow
WHERE paytype = '2'
GROUP BY vendor;
-- Usar la vista
SELECT * FROM taxidata.cashtrips;Ejemplo 3 : Vista de Comparación con CTE (WITH)
-- Vista de comparación combinando tarjeta de crédito y efectivo
-- Uso de CTE (Common Table Expressions) con WITH
CREATE VIEW taxidata.comparepay AS
WITH
cc AS (
SELECT
vendor,
SUM(fare) AS cctotal,
COUNT(*) AS nb_cc
FROM taxidata.yellow
WHERE paytype = '1'
GROUP BY vendor
),
cash AS (
SELECT
vendor,
SUM(fare) AS cashtotal,
COUNT(*) AS nb_cash
FROM taxidata.yellow
WHERE paytype = '2'
GROUP BY vendor
)
SELECT
cc.vendor,
cc.cctotal,
cc.nb_cc,
cash.cashtotal,
cash.nb_cash,
ROUND(cc.cctotal / cash.cashtotal, 2) AS ratio_cc_cash
FROM cc
JOIN cash ON cc.vendor = cash.vendor;
-- Consulta sobre la vista
SELECT * FROM taxidata.comparepay ORDER BY ratio_cc_cash DESC;Gestión de Vistas
-- Listar las vistas disponibles
SHOW VIEWS IN taxidata;
-- Ver la definición de una vista
SHOW CREATE VIEW taxidata.comparepay;
-- Reemplazar una vista existente
CREATE OR REPLACE VIEW taxidata.cctrips AS
SELECT
vendor,
SUM(fare) AS total_fares_cc,
COUNT(*) AS nb_trayectos_cc
FROM taxidata.yellow
WHERE paytype = '1'
GROUP BY vendor;
-- Eliminar una vista
DROP VIEW taxidata.cashtrips;Las Consultas Nombradas en Athena
Las consultas nombradas (Named Queries) permiten guardar consultas SQL usadas frecuentemente directamente en Athena. Se comparten dentro de tu cuenta AWS.
Ventajas
Limitación
Automatizar con AWS CloudFormation
En lugar de crear manualmente las consultas nombradas mediante la consola, puedes desplegarlas como código con AWS CloudFormation.
Plantilla CloudFormation para una Consulta Nombrada
Crea un archivo llamado athenaquery.cf.yml :
AWSTemplateFormatVersion: 2010-09-09
Description: "Consulta Athena nombrada para el análisis de taxis NYC"
Resources:
AthenaNamedQuery:
Type: AWS::Athena::NamedQuery
Properties:
Database: "taxidata"
Description: "Selección de trayectos cuyo importe supera los 100 $"
Name: "FaresOver100DollarsUS"
QueryString: >
SELECT
distance,
paytype,
fare,
tip,
tolls,
surcharge,
total
FROM yellow
WHERE total >= 100.0
ORDER BY total DESC
Outputs:
AthenaNamedQuery:
Description: "El ID de la consulta nombrada Athena creada"
Value: !Ref AthenaNamedQueryDesplegar la Plantilla CloudFormation mediante AWS CLI
# Paso 1 : Validar la plantilla antes del despliegue
aws cloudformation validate-template \
--template-body file://athenaquery.cf.yml
# Paso 2 : Crear la stack CloudFormation
aws cloudformation create-stack \
--stack-name mon-athena-stack \
--template-body file://athenaquery.cf.yml \
--capabilities CAPABILITY_IAM
# Paso 3 : Verificar el estado de la creación
aws cloudformation describe-stacks \
--stack-name mon-athena-stack \
--query 'Stacks[0].StackStatus'
# Paso 4 : Listar las consultas nombradas creadas
aws athena list-named-queries \
--work-group primary
# Paso 5 : Obtener los detalles de una consulta nombrada
aws athena get-named-query \
--named-query-id "ID_RETOURNÉ_PAR_LIST"Este artículo cubre los extractos más útiles — el curso completo AWS Data Engineering Bootcamp (5 capítulos, 17 lecciones, ejercicios corregidos y proyecto final) te lleva hasta el final.
./acceder-al-curso-completo curso gratuito : Dominar Claude CodeFAQ
¿Cuánto tiempo se necesita para aprender AWS Data Engineering Bootcamp?
¿Se necesitan requisitos previos?
¿Por dónde empezar concretamente?
📬 ¿Quieres recibir este tipo de guía cada semana? Suscríbete gratis — código real, cero rodeos.