(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Funciones de ventana (Window) en PySpark: paso a paso

João Barros 06 de July de 2026 4 min de lectura

Las funciones de ventana (Window) en PySpark permiten numerar, ordenar y comparar filas dentro de grupos sin perder el detalle de cada registro. A diferencia de groupBy, que agrupa todo en una sola fila por grupo, una función de ventana mantiene todas las filas y añade el cálculo en una columna nueva. Así se crean rankings, totales acumulados y comparaciones con la fila anterior. Imagine que quiere conocer a los mejores vendedores de cada región o un total de ventas acumulado: son casos perfectos para las funciones de ventana.

Requisitos previos

  • Tener PySpark instalado, o un entorno como Databricks o Microsoft Fabric ya configurado.
  • Saber crear un DataFrame y usar withColumn.
  • Conocimientos básicos de Python.

Paso 1: Crear datos de ejemplo

Empezamos creando una SparkSession y un DataFrame pequeño, con ventas por persona y por región. Un ejemplo pequeño ayuda a ver claramente el efecto de cada función. Guarde este código, porque vamos a construir sobre él en los pasos siguientes.

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("janelas").getOrCreate()

dados = [
    ("Ana", "Norte", 100),
    ("Bruno", "Norte", 150),
    ("Carla", "Norte", 120),
    ("Diogo", "Sul", 200),
    ("Eva", "Sul", 180),
]
df = spark.createDataFrame(dados, ["nome", "regiao", "vendas"])
df.show()

Paso 2: Definir la ventana

Una ventana define cómo debe mirar Spark las filas antes de calcular. partitionBy divide los datos en grupos — aquí, una ventana por región — y orderBy define el orden dentro de cada grupo, en este caso de las ventas más altas a las más bajas. Todavía no se calcula nada: solo describimos la ventana que vamos a reutilizar.

Separar el hecho de definir la ventana del de aplicarla hace el código más legible: podemos reutilizar la misma janela en varios cálculos sin repetirla.

from pyspark.sql.window import Window
from pyspark.sql import functions as F

janela = Window.partitionBy("regiao").orderBy(F.col("vendas").desc())

Paso 3: Numerar filas con row_number()

La función row_number() asigna una posición secuencial — 1, 2, 3... — dentro de cada región, siguiendo el orden de la ventana. Es la forma más directa de crear un ranking. Usamos withColumn para guardar el resultado en una columna nueva llamada posicao.

df = df.withColumn("posicao", F.row_number().over(janela))
df.show()

Paso 4: Calcular un total acumulado

Cuando aplicamos sum() a una ventana ordenada, Spark no suma todo el grupo de una vez: suma de forma acumulada, fila a fila, hasta la fila actual. Es exactamente lo que necesitamos para un total acumulado dentro de cada región.

Por defecto, una ventana ordenada usa el marco desde el inicio del grupo hasta la fila actual, y eso es lo que produce el efecto acumulado que vemos en la columna.

df = df.withColumn("acumulado", F.sum("vendas").over(janela))
df.show()

Paso 5: Comparar con la fila anterior usando lag()

La función lag() obtiene el valor de una fila anterior dentro de la misma ventana — por defecto, la fila inmediatamente superior. Es muy útil para calcular variaciones, como la diferencia de ventas entre dos posiciones. La primera fila de cada grupo no tiene antecesora, por eso recibe null.

df = df.withColumn("venda_anterior", F.lag("vendas").over(janela))
df.show()

Verificar el resultado

Fíjese en el resultado final. En la región Norte, Bruno aparece primero (150), seguido de Carla (120) y Ana (100), por eso la columna posicao muestra 1, 2 y 3. La columna acumulado crece a lo largo del grupo — 150, luego 270, luego 370 — y se reinicia en la región Sul. La columna venda_anterior queda en null en la primera fila de cada región, porque no existe ninguna fila antes de ella. Si ve estos valores, las funciones de ventana están funcionando correctamente.

Para probarlo, pegue cada bloque de código en orden en un notebook y ejecute df.show() tras cada paso, observando cómo aparecen las columnas nuevas una a una.

Conclusión

Con pocas líneas de código, creó un ranking, un total acumulado y una comparación entre filas, todo sin perder el detalle de los datos originales. A partir de aquí, pruebe rank() y dense_rank() para gestionar empates, o lead() para mirar la fila siguiente. Para medias móviles, ajuste el marco de la ventana con rowsBetween. ¿Qué cálculo de su día a día sería más sencillo con una función de ventana?