web-dev-qa-db-fra.com

Python Spark Somme cumulée par groupe à l'aide de DataFrame

Comment puis-je calculer la somme cumulée par groupe en utilisant spécifiquement le DataFrameabstraction; et dans PySpark?

Avec un exemple d'ensemble de données comme suit:

df = sqlContext.createDataFrame( [(1,2,"a"),(3,2,"a"),(1,3,"b"),(2,2,"a"),(2,3,"b")], 
                                 ["time", "value", "class"] )

+----+-----+-----+
|time|value|class|
+----+-----+-----+
|   1|    2|    a|
|   3|    2|    a|
|   1|    3|    b|
|   2|    2|    a|
|   2|    3|    b|
+----+-----+-----+

Je voudrais ajouter une colonne de somme cumulée de value pour chaque class regroupement sur la variable (ordonnée) time.

18
mr kw

Cela peut être fait en utilisant une combinaison d'une fonction de fenêtre et de la valeur Window.unboundedPreceding dans la plage de la fenêtre comme suit:

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

windowval = (Window.partitionBy('class').orderBy('time')
             .rangeBetween(Window.unboundedPreceding, 0))
df_w_cumsum = df.withColumn('cum_sum', F.sum('value').over(windowval))
df_w_cumsum.show()
+----+-----+-----+-------+
|time|value|class|cum_sum|
+----+-----+-----+-------+
|   1|    3|    b|      3|
|   2|    3|    b|      6|
|   1|    2|    a|      2|
|   2|    2|    a|      4|
|   3|    2|    a|      6|
+----+-----+-----+-------+
44
mr kw