目前无法使用 Spark 结构化流以这种方式在非时间戳列上使用窗口。然而,你能做的是转换xxx
列到时间戳列,做groupBy
and count
,然后再变换回来。
from_unixtime
可用于将自 1970-01-01 以来的秒数转换为时间戳。使用xxx
列为秒,可以创建一个假时间戳在窗口中使用:
lines.groupBy(window(from_unixtime($"xxx"), "2 seconds", "1 seconds"), $"val").count()
.withColumn("window", struct(unix_timestamp($"window.start"), unix_timestamp($"window.end")).as("window"))
.filter($"window.col1" =!= 0)
.orderBy($"window.col1")
上面,分组是在转换后的时间戳上完成的,下一行会将其转换回原始数字。过滤器已完成,因为前两行将是一个窗口[0,2]
(即仅在具有xxx
equals 1
)但可以跳过。
上述输入的结果输出:
+------+---+-----+
|window|val|count|
+------+---+-----+
| [1,3]| 50| 2|
| [1,3]| 30| 2|
| [2,4]| 30| 2|
| [2,4]| 50| 1|
| [3,5]| 30| 1|
| [3,5]| 60| 1|
| [4,6]| 60| 2|
| [4,6]| 50| 1|
| [5,7]| 30| 1|
| [5,7]| 60| 1|
| [5,7]| 50| 1|
| [6,8]| 30| 1|
+------+---+-----+