Versions Compared

Key

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

...

Markdown
## 实现细节

- **时间窗口管理:** 为方便管理时间窗口,可以实现一个工具类 `TimeRangeIterator` 迭代预聚合窗口。
- **预聚合值计算:**
  - 不带值过滤:比较简单,每个预聚合窗口的聚合值计算可以直接调用 `GroupByExecutor` 接口的 `List<AggregateResult> calcResult(long curStartTime, long curEndTime)` 得到。
  - 带值过滤:考虑梳理出一个类似于不带值过滤的计算接口。
- **预聚合值处理:** 在 `GroupByEngineDataSet` 类中维护队列,完善 `nextWithoutConstraint()` 的执行逻辑。
- **对于不同类型的聚合函数的处理:** 实现数据结构 `SlidingWindowAggrQueue`,根据聚合函数类型对队列进行不同策略的管理。
- **内存管理:** 在最差情况下,队列中需要缓存窗口内全部的原始数据,对内存造成压力。这里参考 [UFTFUFTD 框架](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=165220355) 的内存管理 —— 实现 `ElasticSerializableQueue` 作为 `SlidingWindowAggrQueue` 内缓存值的队列。
- **兼容现有 GROUP BY:** interval >=< slidingStep,预聚合窗口等于聚合窗口,每次无需缓存,直接返回预聚合结果即可。
- **兼容 UDAF:** 在 UDAF 中,特别地,有返回一个窗口内全部原始数据的需求(如计算方差)。此时可以将预聚合窗口大小设置为 1,增加表示返回原始数据的聚合类型(如 `original`),此时队列中保存的就是窗口内全部的原始数据。

...