Оконные функции не поддерживают рекурсию, но здесь это не требуется. Этот тип сессионизации может быть легко обработан с накопленной суммой:
я есть следующие данные, показывающие доход от покупок.
+-------+--------+-------+
|user_id|visit_id|revenue|
+-------+--------+-------+
| 1| 1| 0|
| 1| 2| 0|
| 1| 3| 0|
| 1| 4| 100|
| 1| 5| 0|
| 1| 6| 0|
| 1| 7| 200|
| 1| 8| 0|
| 1| 9| 10|
+-------+--------+-------+
В конечном итоге я хочу новую колонкуpurch_revenue
показать доход, полученный от покупки в каждой строке. В качестве обходного пути я также попытался ввести идентификатор покупкиpurch_id
который увеличивается каждый раз, когда была сделана покупка. Так что это указано в качестве ссылки.
+-------+--------+-------+-------------+--------+
|user_id|visit_id|revenue|purch_revenue|purch_id|
+-------+--------+-------+-------------+--------+
| 1| 1| 0| 100| 1|
| 1| 2| 0| 100| 1|
| 1| 3| 0| 100| 1|
| 1| 4| 100| 100| 1|
| 1| 5| 0| 100| 2|
| 1| 6| 0| 100| 2|
| 1| 7| 200| 100| 2|
| 1| 8| 0| 100| 3|
| 1| 9| 10| 100| 3|
+-------+--------+-------+-------------+--------+
Я пытался использоватьlag/lead
функционировать так:
user_timeline = Window.partitionBy("user_id").orderBy("visit_id")
find_rev = fn.when(fn.col("revenue") > 0,fn.col("revenue"))\
.otherwise(fn.lead(fn.col("revenue"), 1).over(user_timeline))
df.withColumn("purch_revenue", find_rev)
Это дублирует столбец дохода, еслиrevenue > 0
а также тянет его на один ряд. Ясно, что я могу связать это для конечного N, но это не решение.
revenue > 0
?В качестве альтернативы, есть ли способ увеличить значение на основе условия? Я пытался найти способ сделать это, но изо всех сил пытался найти один.