知识卡片

窗口聚合与非窗口聚合的本质区别

专业/工作 · 503.b

内容

Table API和SQL上的聚合分两类:窗口聚合先把数据按时间或行数切成一个个有限的GroupWindow,再对每个窗口分别分组聚合,每个窗口触发一次、输出一条最终结果,语义上更接近批处理里的”分段统计”;非窗口聚合直接对无限流按Key做GroupBy,是一种持续更新的聚合——同一个Key的结果会随着新数据不断到达而反复修正、反复输出新版本的值,永远不会有”这个Key彻底算完了”的时刻。两者的根本区别在于有没有一个明确的”这批数据到齐了、可以宣布最终结果”的边界:窗口聚合有,靠水位线判断;非窗口聚合没有,只能不断地用changelog的方式把每次更新都推给下游,也因此非窗口聚合天然需要下游支持[[动态表的三种更新模式|Retract或Upsert模式]]才能正确接收这种持续修正的结果。

参考来源

《Flink入门与实战》第7章《Table API和SQL》