我有一个如下所示的Spark数据框:
+-----+--------+
| user|timestamp|
+-----+---------+
|user1| 0|
|user1| 6|
|user2| 6|
|user1| 28|
|user2| 37|
|user2| 70|
|user2| 77|
+-----+---------+
我用val window = Window.partitionBy($"user").orderBy($"timestamp")
来创建窗口。
对于每一行,我必须检查当前行和上一行之间的时间戳差异是否小于30:如果是,则使begin
为最后重置该窗口的第一个时间戳;否则将begin
设置为当前时间戳。
我用过
df.withColumn("begin", when($"timestamp" - lag($"timestamp",1).over(window) < 30 , first($"timestamp").over(window)).otherwise($"timestamp"))
但这会在整个窗口中花费first
时间戳,结果如下:
+-----+---------+----+
| user|timestamp|begin|
+-----+---------+-----+
|user1| 0| 0|
|user1| 6| 0|
|user1| 28| 0|
|user2| 6| 6|
|user2| 37| 6|
|user2| 70| 70|
|user2| 77| 6|
+-----+---------+-----+
但是我希望输出在最后一次重置时在窗口上具有first
时间戳(输出应该在最后一行中将列begin
作为70
而不是{{1 }}):
6
我该如何进行? Spark是否支持此可变长度窗口范围?