目录:

  • 在流上计算聚合
    • 滚动
    • 滑动
    • 会话
  • keyed vs non-keyed窗口
  • 处理迟到事件
  • 性能考虑
  • 窗口状态
  • 自定义窗口
  • Window API 的奇怪点

在流上计算聚合

批处理:可以生成总结所有数据的最终统计结果
流式传输:只能统计流的有界子集,例如

  • 今天到目前为止的订单
  • 每秒事务数

因为我们不知道流什么时候会结束甚至是否会结束,所以如果我们想基于流做某种统计,那么只能:

  • 持续统计到目前为止的流消息
  • 将流切割成1个个窗口,每个窗口认为是批

Keyed and non-keyed窗口

keyed

  1. stream
  2. .keyBy(...)
  3. .window(...) // window assigner
  4. .reduce/aggregate/process(...) // window function

窗口运算主要发生在keyed stream——例如,计算每个用户的页面浏览量,或者按产品 ID 计算销量。
窗口 API 有两个基本抽象:窗口分配器和窗口函数。

  • 窗口分配器根据需要懒惰地创建新窗口,并将传入事件分配给窗口。
  • 窗口函数负责进行窗口内容的聚合计算。