flink的窗口

2025-06-08 07:16:17 世界杯大力神杯

目录

窗口分类

1.按照驱动类型分类

1. 时间窗口(Time window)

2.计数窗口(Count window)

2.按照窗口分配数据的规则分类

窗口API分类

API调用

窗口分配器器:

窗口函数

增量聚合函数:

全窗口函数

flink sql 窗口函数

窗口 | Apache Flink

窗口分类

1.按照驱动类型分类

1. 时间窗口(Time window)

时间窗口以时间点定义窗口的开始和结束,因此截取出就是某一段时间的数据。当到达结束时间时窗口不在接受数据,触发计算输出结果,并关闭销毁窗口。

flink有一个专门的类用来表示时间窗口TimeWindow,这个类只有两个私有属性;窗口的方法获取最大时间戳为end-1,因此窗口[start,end) 左开右闭;

@PublicEvolving

public class TimeWindow extends Window {

private final long start;

private final long end;

public TimeWindow(long start, long end) {

this.start = start;

this.end = end;

}

@Override

public long maxTimestamp() {

return end - 1;

}

2.计数窗口(Count window)

计数窗口是基于元素个数截取,在到达固定个数是就触发计算并关闭窗口。

stream.keyBy(data -> true)

.window(SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(2)))

// .max()

.aggregate(new AvgPv())

.print();

查看源代码,windou函数后见windowStrream时获取默认的触发器

@PublicEvolving

public WindowedStream(KeyedStream input, WindowAssigner windowAssigner) {

this.input = input;

this.builder =

new WindowOperatorBuilder<>(

windowAssigner,

windowAssigner.getDefaultTrigger(input.getExecutionEnvironment()), //湖区触发器

input.getExecutionConfig(),

input.getType(),

input.getKeySelector(),

input.getKeyType());

}

// 计数窗口底层采用全局窗口加计数器来实现

public WindowedStream countWindow(long size) {

return window(GlobalWindows.create()).trigger(PurgingTrigger.of(CountTrigger.of(size)));

}

public WindowedStream countWindow(long size, long slide) {

return window(GlobalWindows.create())

.evictor(CountEvictor.of(size))

.trigger(CountTrigger.of(slide));

}

2.按照窗口分配数据的规则分类

滚动窗口(Tumbling Window)

窗口大小固定,窗口没有重叠;

滑动窗口 (Sliding Window)

滑动窗口有重叠,也可以没有重叠,如果窗口size和滑动size相等,等于滚动窗口;

会话窗口 (Session Window)

基于会话对窗口进行分组,与其他两个不同的是,会话窗口是借用会话