Flink中窗口的详细分类

295 阅读2分钟

在 Apache Flink 中,每种窗口类型都有其更细致的分类,具体取决于它们基于时间特征的不同方式(例如事件时间或处理时间)和触发条件。以下是每种窗口类型的详细分类:

1. 滚动窗口(Tumbling Window)

滚动窗口可以根据事件时间或处理时间来划分。

  • 事件时间滚动窗口(Event Time Tumbling Window)

    java
    复制代码
    dataStream
        .keyBy(value -> value.f0)
        .window(TumblingEventTimeWindows.of(Time.seconds(10)))
        .sum(1);
    
    • 基于事件时间,如果是刚启动,第一条数据不会触发窗口,第二条才会触发,然后每次最新数据不会触发,会保留在窗口。
  • 处理时间滚动窗口(Processing Time Tumbling Window)

    java
    复制代码
    dataStream
        .keyBy(value -> value.f0)
        .window(TumblingProcessingTimeWindows.of(Time.seconds(10)))
        .sum(1);
    

2. 滑动窗口(Sliding Window)

滑动窗口也可以根据事件时间或处理时间来划分。

  • 事件时间滑动窗口(Event Time Sliding Window)

    java
    复制代码
    dataStream
        .keyBy(value -> value.f0)
        .window(SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(5)))
        .sum(1);
    
  • 处理时间滑动窗口(Processing Time Sliding Window)

    java
    复制代码
    dataStream
        .keyBy(value -> value.f0)
        .window(SlidingProcessingTimeWindows.of(Time.seconds(10), Time.seconds(5)))
        .sum(1);
    

3. 会话窗口(Session Window)

会话窗口可以根据事件时间或处理时间来划分。

  • 事件时间会话窗口(Event Time Session Window)

    java
    复制代码
    dataStream
        .keyBy(value -> value.f0)
        .window(EventTimeSessionWindows.withGap(Time.minutes(5)))
        .sum(1);
    
  • 处理时间会话窗口(Processing Time Session Window)

    java
    复制代码
    dataStream
        .keyBy(value -> value.f0)
        .window(ProcessingTimeSessionWindows.withGap(Time.minutes(5)))
        .sum(1);
    

4. 全局窗口(Global Window)

全局窗口不区分事件时间和处理时间,必须配合触发器使用。

  • 全局窗口(Global Window)

    java
    复制代码
    dataStream
        .keyBy(value -> value.f0)
        .window(GlobalWindows.create())
        .trigger(CountTrigger.of(100))
        .sum(1);
    

5. 计数窗口(Count Window)

计数窗口根据元素数量而不是时间来划分。

  • 滚动计数窗口(Tumbling Count Window)

    java
    复制代码
    dataStream
        .keyBy(value -> value.f0)
        .countWindow(100)
        .sum(1);
    
  • 滑动计数窗口(Sliding Count Window)

    java
    复制代码
    dataStream
        .keyBy(value -> value.f0)
        .countWindow(100, 10)
        .sum(1);
    

总结

每种窗口类型都有细分的分类,主要根据时间特征(事件时间或处理时间)和触发条件(计数窗口或时间窗口)来区分。选择合适的窗口类型和分类,可以更有效地处理和聚合数据流中的信息。

详细分类整理

滚动窗口(Tumbling Window)

  • 事件时间滚动窗口(Event Time Tumbling Window)
  • 处理时间滚动窗口(Processing Time Tumbling Window)

滑动窗口(Sliding Window)

  • 事件时间滑动窗口(Event Time Sliding Window)
  • 处理时间滑动窗口(Processing Time Sliding Window)

会话窗口(Session Window)

  • 事件时间会话窗口(Event Time Session Window)
  • 处理时间会话窗口(Processing Time Session Window)

全局窗口(Global Window)

  • 全局窗口(Global Window)

计数窗口(Count Window)

  • 滚动计数窗口(Tumbling Count Window)
  • 滑动计数窗口(Sliding Count Window)