Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

可以推导出预聚合窗口关于 interval 和 slidingStep 的关系(感谢 Xiangwei Wei 贡献的精彩公式推导~):

  • 如果 interval  能被 slidingStep 整除,则窗口大小为 slidingStep
  • 否则:
    • 首先有 interval / slidingStep 向下取整个大小为 slidingStep 的窗口。
    • 后面循环出现大小为 interval % slidingStepslidingStep - interval % slidingStep 的窗口。
    • 为了方便处理,我们忽略开始的若干个大小为 slidingStep 的窗口, 将整个时间范围循环窗口大小 interval % slidingStep slidingStep - interval % slidingStep 拆分预聚合窗口。


Markdown
### 根据预聚合结果计算聚合值

对于不同的聚合函数,按照其特点有不同的处理方式,可以分为三组:

- SUM、COUNT、AVG:将当前聚合窗口内的预聚合值缓存在队列中,更新队列时同时更新聚合值。
- MAX_VALUE、MIN_VALUE、EXTREME:使用单调队列算法进行优化([LEETCODE-239](https://leetcode-cn.com/problems/sliding-window-maximum/solution/))。
- FIRST_VALUE、LAST_VALUE、MAX_TIME、MIN_TIME:顺序遍历时,LAST_VALUE 和 MAX_TIME 的聚合值总出现在右边界的预聚合值,因此中间结果无需缓存。反之,逆序遍历时,FIRST_VALUE 和 MIN_TIME 的预聚合值无需缓存。

时间复杂度:O(n + m),m 为预聚合窗口的数量。

空间复杂度:O(p + k),p 为缓存的 BatchData 大小,k 为每个聚合窗口中预聚合窗口的数量。

例:整体时间窗口为 [0, 32),序列 `root.sg1.d1.s1` 的数据情况如下,灰色单元格表示对应时间戳没有数据,临近相同颜色的单元格表示来自同一个 BatchData。

执行:`SELECT sum(s1), max_value(s1), last_value(s1), min_time(s1) FROM root.sg1.d1 GROUP BY ([0,32),8ms,2ms)`

解析 SQL 后得到参数,startTime = 0,endTime = 32,interval = 8,slidingStep = 2。计算得到每个预聚合窗口大小为 2。

下面演示计算过程:

...