Pyspark cumum по тем же значениям в столбце orderBy - PullRequest
1 голос
/ 18 марта 2020

У меня есть следующий фрейм данных:

+----+----+-----+
|col1|col2|value|
+----+----+-----+
|  11|   a|    1|
|  11|   a|    2|
|  11|   b|    3|
|  11|   a|    4|
|  11|   b|    5|
|  22|   a|    6|
|  22|   b|    7|
+----+----+-----+

Я хочу вычислить, чтобы вычислить сумму столбца 'value', который разделен на 'col1' и упорядочен по 'col2'.

Это желаемый результат:

+----+----+-----+------+
|col1|col2|value|cumsum|
+----+----+-----+------+
|  11|   a|    1|     1|
|  11|   a|    2|     3|
|  11|   a|    4|     7|
|  11|   b|    3|    10|
|  11|   b|    5|    15|
|  22|   a|    6|     6|
|  22|   b|    7|    13|
+----+----+-----+------+

Я использовал этот код, который дает мне df, показанный ниже. Это не то, что я хотел. Может кто-то мне помочь, пожалуйста?

df.withColumn("cumsum", F.sum("value").over(Window.partitionBy("col1").orderBy("col2").rangeBetween(Window.unboundedPreceding, 0)))
+----+----+-----+------+
|col1|col2|value|cumsum|
+----+----+-----+------+
|  11|   a|    2|     7|
|  11|   a|    1|     7|
|  11|   a|    4|     7|
|  11|   b|    3|    15|
|  11|   b|    5|    15|
|  22|   a|    6|     6|
|  22|   b|    7|    13|
+----+----+-----+------+

1 Ответ

0 голосов
/ 18 марта 2020

Вы должны использовать .rowsBetween вместо .rangeBetween в предложении вашего окна.

строкВ промежутке (против) диапазонаВ промежутке

Example:

df.withColumn("cumsum", sum("value").over(Window.partitionBy("col1").orderBy("col2").rowsBetween(Window.unboundedPreceding, 0))).show()

#+----+----+-----+------+
#|col1|col2|value|cumsum|
#+----+----+-----+------+
#|  11|   a|    1|     1|
#|  11|   a|    2|     3|
#|  11|   a|    4|     7|
#|  11|   b|    3|    10|
#|  11|   b|    5|    15|
#|  12|   a|    6|     6|
#|  12|   b|    7|    13|
#+----+----+-----+------+
...