У меня есть датафрейм с уже вычисленными значениями 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|
+---+----------+---------+----------------+
У кого-нибудь есть идея пойти дальше?