PySpark: вычислить сумму по окну с обратным отсчетом - PullRequest
1 голос
/ 08 марта 2019

У меня есть датафрейм с уже вычисленными значениями date и days_diff.Цель - извлекать каждую дату, которая:
- имеет значение days_diff> 90
- имеет значение кумулятивного days_diff> 90

Я подумал, что понадобится вычисление cumum.Итак, что мы хотим сделать:
Применить операцию cumsum к days_diff, но она должна отсчитывать время, когда cumsum достигает определенного числа.

Я предоставлю почти те же данные, что и я.Давайте установим этот предел на 90 и создадим наш фрейм данных:

from pyspark.sql.functions import *
from pyspark.sql.Window import *

limit = 90
# We'll try to find it with a null value that shouldn't bother us
values = [(1, '2018-12-26', 7), (1, '2018-12-19', 5), (1, '2018-12-14', 38),
        (1, '2018-11-06', 10), (1, '2018-10-27', 61), (1, '2018-08-27', 17), 
       (1, '2018-08-10', 37), (1, '2018-07-04', 1), (1, '2018-07-03', 1), 
       (1, '2018-07-02', 3), (1, '2018-06-29', 51), (1, '2018-05-09', 5), 
       (1, '2018-05-04', 22), (1, '2018-04-12', 58), (1, '2018-02-13', 13)
       (1, '2018-01-31', None)]

df = spark.createDataFrame(values, ['id', 'date', 'days_diff']).orderBy('date')
df.show()
+---+----------+---------+
| id|      date|days_diff|
+---+----------+---------+
|  1|2018-01-31|     null|
|  1|2018-02-13|       13|
|  1|2018-04-12|       58|
|  1|2018-05-04|       22|
|  1|2018-05-09|        5|
|  1|2018-06-29|       51|
|  1|2018-07-02|        3|
|  1|2018-07-03|        1|
|  1|2018-07-04|        1|
|  1|2018-08-10|       37|
|  1|2018-08-27|       17|
|  1|2018-10-27|       61|
|  1|2018-11-06|       10|
|  1|2018-12-14|       38|
|  1|2018-12-19|        5|
|  1|2018-12-26|        7|
+---+----------+---------+

Вот способ, которым я нашел, чтобы вычислить сумму по дням_diff:

win_spec = (Window.orderBy('id', 'date').rowsBetween(Window.unboundedPreceding, 0))
df_cum = df.withColumn('days_diff_cumsum', sum(df.days_diff).over(win_spec))

Это дает нам:

+---+----------+---------+----------------+
| id|      date|days_diff|diff_days_cumsum|
+---+----------+---------+----------------+
|  1|2018-01-31|     null|            null|
|  1|2018-02-13|       13|              13|
|  1|2018-04-12|       58|              71|
|  1|2018-05-04|       22|              93|
|  1|2018-05-09|        5|              98|
|  1|2018-06-29|       51|             149|
|  1|2018-07-02|        3|             152|
|  1|2018-07-03|        1|             153|
|  1|2018-07-04|        1|             154|
|  1|2018-08-10|       37|             191|
|  1|2018-08-27|       17|             208|
|  1|2018-10-27|       61|             269|
|  1|2018-11-06|       10|             279|
|  1|2018-12-14|       38|             317|
|  1|2018-12-19|        5|             322|
|  1|2018-12-26|        7|             329|
+---+----------+---------+----------------+

У кого-нибудь есть идея пойти дальше?

...