Flink系列:WindowFunction使用方法

    技术2026-04-18  2

     

    语法

    https://ci.apache.org/projects/flink/flink-docs-master/api/java/org/apache/flink/streaming/api/functions/windowing/WindowFunction.html

     

    分组

    分组的stream调用keyBy(…)和window(…)

    非分组的stream中window()换成了windowAll(…)

     

    触发器Trigger

        每个 Window 都有一个Trigger,Trigger(触发器)指定了函数在什么条件下可被应用(函数何时被触发),一个触发策略可以是 "当窗口中的元素个数超过9个时" 或者 "当水印达到窗口的边界时"。触发器还可以决定在窗口创建和删除之间的任意时刻清除窗口的内容

         触发器决定了一个窗口何时可以被窗口函数处理,每一个窗口分配器都有一个默认的触发器,如果默认的触发器不能满足你的需要,你可以通过调用trigger(...)来指定一个自定义的触发器。触发器的接口有5个方法来允许触发器处理不同的事件:   *onElement()方法,每个元素被添加到窗口时调用   *onEventTime()方法,当一个已注册的事件时间计时器启动时调用   *onProcessingTime()方法,当一个已注册的处理时间计时器启动时调用   *onMerge()方法,与状态性触发器相关,当使用会话窗口时,两个触发器对应的窗口合并时,合并两个触发器的状态。   *最后一个clear()方法执行任何需要清除的相应窗口

    上面的方法中有两个需要注意的地方: 1)第一、三通过返回一个TriggerResult来决定如何操作调用他们的事件,这些操作可以是下面操作中的一个;CONTINUE:什么也不做FIRE:触发计算PURGE:清除窗口中的数据FIRE_AND_PURGE:触发计算并清除窗口中的数据 2)这些函数可以被用来为后续的操作注册处理时间定时器或者事件时间计时器

    一旦一个触发器决定一个窗口已经准备好进行处理,它将触发并返回FIRE或者FIRE_AND_PURGE。如果是FIRE的话,将保持window中的内容,FIRE_AND_PURGE的话,会清除window的内容。默认情况下,预实现的触发器仅仅是FIRE,不会清除window的状态。

     

    内置的触发器

    Flink有一些内置的触发器:   *EventTimeTrigger(前面提到过)触发是根据由水印衡量的事件时间的进度来的   *ProcessingTimeTrigger 根据处理时间来触发   *CountTrigger 一旦窗口中的元素个数超出了给定的限制就会触发   *PurgingTrigger 作为另一个触发器的参数并将它转换成一个清除类型

     

     

     

    扩展

    Flink系列:自定义Window窗口使用方法

    Flink系列:Window窗口增量/全量聚合方法(reduce、aggregate 、apply、process)

    Flink系列:WindowFunction事件Time时间乱序处理Demo例子

    Processed: 0.012, SQL: 9