目录:
- 在流上计算聚合
- 滚动
- 滑动
- 会话
- keyed vs non-keyed窗口
- 处理迟到事件
- 性能考虑
- 窗口状态
- 自定义窗口
- Window API 的奇怪点
在流上计算聚合
批处理:可以生成总结所有数据的最终统计结果
流式传输:只能统计流的有界子集,例如
- 今天到目前为止的订单
- 每秒事务数
因为我们不知道流什么时候会结束甚至是否会结束,所以如果我们想基于流做某种统计,那么只能:
- 持续统计到目前为止的流消息
- 将流切割成1个个窗口,每个窗口认为是批
Keyed and non-keyed窗口
keyed
stream
.keyBy(...)
.window(...) // window assigner
.reduce/aggregate/process(...) // window function
窗口运算主要发生在keyed stream——例如,计算每个用户的页面浏览量,或者按产品 ID 计算销量。
窗口 API 有两个基本抽象:窗口分配器和窗口函数。
- 窗口分配器根据需要懒惰地创建新窗口,并将传入事件分配给窗口。
- 窗口函数负责进行窗口内容的聚合计算。