Manual de PySpark
PySpark es la API de Python para Apache Spark. Permite procesar datos distribuidos usando DataFrames, SQL, streaming y librerias del ecosistema Spark sin escribir Scala o Java directamente.
Conviene usar PySpark cuando los datos no caben comodamente en memoria, cuando el procesamiento debe distribuirse en un cluster o cuando el pipeline forma parte de una plataforma como Databricks, EMR, Glue, Synapse o Kubernetes.
Capitulos previstos
- Introduccion y entorno
- DataFrames y schemas
- Transformaciones y acciones
- Spark SQL
- Lectura y escritura
- Joins agregaciones y ventanas
- Streaming
- Optimizacion
- Testing y buenas practicas
- Arquitectura interna de Spark
- Particionado, shuffle y skew
- Pipelines con Parquet y Delta
- PySpark en produccion
- Observabilidad y troubleshooting
- Patrones de data engineering
- Proyecto final
Instalacion local
Para aprendizaje local:
bash
pip install pysparkCrear una sesion:
python
from pyspark.sql import SparkSession
spark = (
SparkSession.builder
.appName("learning-pyspark")
.master("local[*]")
.getOrCreate()
)Primer DataFrame
python
rows = [
("ES", "order_created", 120.5),
("PT", "order_created", 80.0),
("ES", "order_cancelled", 15.0),
]
df = spark.createDataFrame(rows, ["country", "event_type", "amount"])
df.show()
df.printSchema()Agregacion:
python
from pyspark.sql import functions as F
summary = (
df
.groupBy("country")
.agg(
F.count("*").alias("events"),
F.sum("amount").alias("total_amount"),
)
)
summary.show()Modelo mental
Spark evalua de forma perezosa. Muchas operaciones solo construyen un plan; la ejecucion real ocurre cuando llamas a una accion:
- Transformaciones:
select,filter,withColumn,groupBy,join. - Acciones:
show,count,collect,write.
Esto permite optimizar el plan antes de ejecutar, pero tambien puede sorprender al empezar: un error puede aparecer tarde, cuando llega la accion.
Buenas practicas
- Define schemas explicitamente al leer datos importantes.
- Evita
collect()salvo en resultados pequenos. - Usa funciones de
pyspark.sql.functionsen vez de UDFs cuando sea posible. - Escribe en formatos columnares como Parquet o Delta.
- Revisa planes con
explain()cuando una consulta sea lenta.
Errores comunes
- Pensar en Spark como Pandas distribuido sin cambiar el modelo mental.
- Traer datos al driver con
collect()sin controlar tamano. - Usar UDFs para operaciones que Spark ya sabe optimizar.
- Leer CSV sin schema y confiar en inferencia en produccion.
- Hacer demasiados
count()solo para depurar.
Ejercicio
- Crea un DataFrame de eventos con pais, tipo y cantidad.
- Filtra solo eventos de compra.
- Agrupa por pais.
- Calcula numero de eventos e importe total.
- Escribe el resultado en Parquet.
