从pyspark中的滞后中查找下一个不同的值
我有一个像这样的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
+-----+----------+
|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
+-----+----------+
不,不相关。该列只是值列的串联(发生在前面的某个步骤中)。与此无关。如果可以从该列中导出结果,也可以。