FLINK-窗口函数-ReduceFunction/AggregateFunction/ProcessWindowFunction

1.ReduceFunction

  增量聚合,输入输出元素类型相同。

2.AggregateFunction

  增量聚合,输入输出元素类型可以不相同。

3.ProcessWindowFunction

  一些业务场景,我们需要收集窗口内所有的数据进行计算,例如计算窗口数据的中位数,或者计算窗口数据中出现频率最高的值。这样的需求,使用ReduceFunction和AggregateFunction就无法实现了。这个时候就需要ProcessWindowFunction了。

process()方法接受的参数为:

  window的key,

  Iterable迭代器包含窗口的所有元素,

  Collector用于输出结果流。

  Context参数和别的process方法一样。而ProcessWindowFunction的Context对象还可以访问window的元数据(窗口开始和结束时间),当前处理时间和水位线,per-window state和per-key global state,side outputs。

  • per-window state: 用于保存一些信息,这些信息可以被process()访问,只要process所处理的元素属于这个窗口。
  • per-key global state: 同一个key,也就是在一条KeyedStream上,不同的window可以访问per-key global state保存的值。

4.结合使用

  ReduceFunction/AggregateFunction和ProcessWindowFunction结合使用,分配到某个窗口的元素将被提前聚合,而当窗口的trigger触发时,也就是窗口收集完数据关闭时,将会把聚合结果发送到ProcessWindowFunction中,这时Iterable参数将会只有一个值,就是前面聚合的值。

input
  .keyBy(...)
  .timeWindow(...)
  .reduce(
    incrAggregator: ReduceFunction[IN],
    function: ProcessWindowFunction[IN, OUT, K, W])

input
  .keyBy(...)
  .timeWindow(...)
  .aggregate(
    incrAggregator: AggregateFunction[IN, ACC, V],
    windowFunction: ProcessWindowFunction[V, OUT, K, W])

结合使用:

  1. 可将ProcessWindowFunction与增量聚合函数ReduceFunctionAggregateFunction结合。
  2. 元素到达窗口时增量聚合,当窗口关闭时对增量聚合的结果用ProcessWindowFunction再进行全量聚合。
  3. 既可以增量聚合,也可以访问窗口的元数据信息(如开始结束时间、状态等)。
posted @ 2021-05-06 17:32  奇葩兔子  阅读(1518)  评论(0)    收藏  举报