PySpark: fonctions de fenêtre
objectif
Expliquer et montrer comment utiliser Window pour lags, rangs et moyennes mobiles.
code minimal
from pyspark.sql import Window, functions as F
w = Window.partitionBy("user_id").orderBy("ts").rowsBetween(-2, 0)
df = df.withColumn("mov_avg", F.avg("value").over(w))
df = df.withColumn("lag1", F.lag("value").over(Window.partitionBy("user_id").orderBy("ts")))
df.select("user_id","ts","value","mov_avg","lag1").show(5)
utilisation
# top-N par groupe
w2 = Window.partitionBy("country").orderBy(F.desc("score"))
df_top = df.withColumn("rn", F.row_number().over(w2)).where(F.col("rn") <= 3)
variante(s) utile(s)
# window par range temporel
w3 = Window.partitionBy("user_id").orderBy("ts").rangeBetween(-3600, 0)
notes
- rowsBetween utilise des offsets en lignes; rangeBetween utilise l’ordre et le type de la colonne.
- Attention aux partitions déséquilibrées.