Apache Spark: Cuando los Datos No Caben en una Maquina
Spark es el motor de procesamiento distribuido mas popular. Cuando tus datos superan los 10-50 GB, Spark distribuye el procesamiento entre multiples nodos, permitiendo procesar terabytes e incluso petabytes.
| Volumen | Herramienta | Latencia |
|---|---|---|
| < 1 GB | Pandas | Segundos |
| 1-100 GB | Polars / DuckDB | Segundos-Minutos |
| 100 GB - 10 TB | PySpark | Minutos |
| 10 TB+ | Spark cluster (EMR/Dataproc) | Minutos-Horas |
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.window import Window
spark = SparkSession.builder \
.appName('AnalisisVentasLATAM') \
.config('spark.sql.adaptive.enabled', 'true') \
.getOrCreate()
df_ventas = spark.read.parquet('s3://data-lake/raw/ventas/')
df_productos = spark.read.parquet('s3://data-lake/raw/productos/')
resultado = (
df_ventas
.join(df_productos, 'product_id', 'left')
.filter(F.col('country').isin(['AR', 'MX', 'CO', 'BR', 'CL']))
.withColumn('year_month', F.date_format('created_at', 'yyyy-MM'))
.groupBy('year_month', 'country', 'category')
.agg(
F.sum('amount').alias('total_revenue'),
F.countDistinct('user_id').alias('unique_buyers'),
F.avg('amount').alias('avg_order_value')
)
.orderBy('year_month', F.desc('total_revenue'))
)
resultado.write.mode('overwrite').partitionBy('year_month') \
.parquet('s3://data-lake/processed/revenue/')🚀 Optimizacion Clave
El particionamiento es la optimizacion mas impactante en Spark. Particiona por la columna que mas filtras (generalmente fecha). Puede reducir tiempos de horas a segundos.
| Proveedor | Servicio | Costo Aprox |
|---|---|---|
| AWS | EMR | USD 0.10/hora por nodo |
| GCP | Dataproc | USD 0.01/hora + compute |
| Azure | HDInsight | Variable |
| Databricks | Databricks | Premium sobre cloud |
En la siguiente leccion veremos data lakes y la arquitectura lakehouse.