从pyspark中的滞后中查找下一个不同的值

从pyspark中的滞后中查找下一个不同的值,pyspark,Pyspark,我有一个像这样的pyspark数据框 +-----+----------+ |value|val_joined| +-----+----------+ | 3| 3| | 4| 3+4| | 5| 3+4+5| | 5| 3+4+5| | 5| 3+4+5| | 2| 3+4+5+2| +-----+----------+ +-----+----------+------+ |value|val_joi

我有一个像这样的pyspark数据框

+-----+----------+
|value|val_joined|
+-----+----------+
|    3|         3|
|    4|       3+4|
|    5|     3+4+5|
|    5|     3+4+5|
|    5|     3+4+5|
|    2|   3+4+5+2|
+-----+----------+
+-----+----------+------+
|value|val_joined|result|
+-----+----------+------+
|    3|         3|   4.0|
|    4|       3+4|   5.0|
|    5|     3+4+5|   2.0|
|    5|     3+4+5|   2.0|
|    5|     3+4+5|   2.0|
|    2|   3+4+5+2|   NaN|
+-----+----------+------+
从这里,我必须创建另一个类似这样的专栏

+-----+----------+
|value|val_joined|
+-----+----------+
|    3|         3|
|    4|       3+4|
|    5|     3+4+5|
|    5|     3+4+5|
|    5|     3+4+5|
|    2|   3+4+5+2|
+-----+----------+
+-----+----------+------+
|value|val_joined|result|
+-----+----------+------+
|    3|         3|   4.0|
|    4|       3+4|   5.0|
|    5|     3+4+5|   2.0|
|    5|     3+4+5|   2.0|
|    5|     3+4+5|   2.0|
|    2|   3+4+5+2|   NaN|
+-----+----------+------+
结果列如下所示,对于名为value的列中的一项,查找下一项。因此,对于值3,它将是4,对于值4,它将是5

但是,如果存在重复的值,例如重复3次的值5,那么简单的延迟将不起作用。因为前5的滞后将导致5。我基本上想重复使用滞后直到值!=滞后(值)或滞后(值)为空


在没有udf和联接的情况下,如何在pyspark中执行此操作

我们可以选择两个窗口,通过在另一个窗口中指定一个
单调递增的\u id
最后一个
值,在第一个窗口中查找下一行值,如下所示:

import pyspark.sql.functions as F
w = Window.orderBy('idx')
w1 = Window.partitionBy('value')

(df.withColumn('idx',F.monotonically_increasing_id())
.withColumn("result",F.last(F.lead("value").over(w)).over(w1)).orderBy('idx')
.drop('idx')).show()

如果值中的数字可以重复下面的示例:

+-----+----------+
|value|val_joined|
+-----+----------+
|3    |3         |
|4    |3+4       |
|5    |3+4+5     |
|5    |3+4+5     |
|5    |3+4+5     |
|2    |3+4+5+2   |
|5    |3+4+5+2+5 | <- this value is repeated later
+-----+----------+

不,不相关。该列只是值列的串联(发生在前面的某个步骤中)。与此无关。如果可以从该列中导出结果,也可以。