Оконные функции не поддерживают рекурсию, но здесь это не требуется. Этот тип сессионизации может быть легко обработан с накопленной суммой:

я есть следующие данные, показывающие доход от покупок.

+-------+--------+-------+
|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?В качестве альтернативы, есть ли способ увеличить значение на основе условия? Я пытался найти способ сделать это, но изо всех сил пытался найти один.

Ответы на вопрос(1)

Ваш ответ на вопрос