问题描述
考虑我有一个带有时间戳字段列的输入 df 并且在将窗口持续时间(没有滑动间隔)设置为:
10 分钟
输入时间(2019-02-28 22:33:02)
形成的窗口为(2019-02-28 22:30:02) to (2019-02-28 22:40:02)
8 分钟
输入相同的时间(2019-02-28 22:33:02)
形成的窗口为(2019-02-28 22:26:02) to (2019-02-28 22:34:02)
5 分钟
输入相同的时间(2019-02-28 22:33:02)
形成的窗口为(2019-02-28 22:30:02) to (2019-02-28 22:35:02)
14 分钟
输入时间(2019-02-28 22:33:02)
形成的窗口为(2019-02-28 22:32:02) to (2019-02-28 22:46:02)
所以,我的问题是:
spark 如何计算给定输入 ts 的窗口的开始时间?
解决方法
O'Reilly 出版的“Stream Processing with Apache Spark”一书中的“Understanding How Intervals are computing”部分对此进行了解释:
“窗口间隔与所用时间单位的下一个”相对应的秒/分钟/小时/天的开始时间对齐。”
在您的情况下,您总是使用分钟,因此下一个时间幅度是“小时”。因此它试图到达小时的开始。您的案例更详细(忘记 2 秒,这只是内部延迟):
- 10 分钟:22:40 + 10 + 10 -> 小时开始
- 8 分钟:22:34 + 8 + 8 + 8 -> 小时开始
- 5 分钟:22:35 + 5 + 5 + ... + 5 -> 小时开始
- 14 分钟:22:46 + 14 -> 小时开始
它独立于传入的数据及其时间戳/事件时间。
作为一个附加节点,下窗口边界是inclusive,而上边界是exclusive。在数学符号中,这看起来像 [start_time,end_time)
。