В настоящее время невозможно использовать окна для столбцов без меток времени, используя Spark Structured Streaming. Однако вы можете преобразовать столбец xxx
в столбец отметки времени , выполнить groupBy
и 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
равно 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|
+------+---+-----+