Мне удалось найти решение, используя адаптацию этого ответа SO .
Примечание. Это решение работает только при наличии не более одного вызова window
,это означает, что несколько временных окон не допускаются.Выполнение быстрого поиска на spark github показывает, что существует жесткое ограничение для <= 1
окон.
Используя withColumn
для определения сегментов для каждой строки, мы можем затем сгруппировать поновый столбец напрямую:
from pyspark.sql import functions as F
from datetime import datetime as dt, timedelta as td
start = dt.now()
second = td(seconds=1)
data = [(start, 0), (start+second, 1), (start+ (12*second), 2)]
df = spark.createDataFrame(data, ('foo', 'bar'))
# Create a new column defining the window for each bar
df = df.withColumn("barWindow", F.col("bar") - (F.col("bar") % 2))
# Keep the time window as is
fooWindow = F.window(F.col("foo"), "12 seconds").start.alias("foo")
# Use the new column created
results = df.groupBy(fooWindow, F.col("barWindow")).count().show()
# +-------------------+---------+-----+
# | foo|barWindow|count|
# +-------------------+---------+-----+
# |2019-01-24 14:12:48| 0| 2|
# |2019-01-24 14:13:00| 2| 1|
# +-------------------+---------+-----+