窗口计算离不开水印,即 watermark,关于 watermark 可以看我上一篇文章 Flink 时间属性及 WATERMARK 水印 。
1. 滚动窗口
滚动窗口(TUMBLE)将每个元素分配到一个指定大小的窗口中。通常,滚动窗口有一个固定的大小,并且不会出现重叠。例如,如果指定了一个5分钟大小的滚动窗口,无限流的数据会根据时间划分为[0:00, 0:05)
、[0:05, 0:10)
、[0:10, 0:15)
等窗口。
CREATE TEMPORARY TABLE src_kafka (
`create_time` TIMESTAMP(3) NOT NULL METADATA from 'timestamp',
`offset` bigINT NOT NULL METADATA from 'offset' ,
`partition` INT NOT NULL METADATA from 'partition' ,
cs1 STRING,
ip STRING,
b STRING,
t STRING,
n STRING,
tm BIGINT,
event_time as TO_TIMESTAMP(tm),
watermark for event_time as event_time - INTERVAL '2' SECOND, -- 定义水位线
PRIMARY KEY (`partition`, `offset`) NOT ENFORCED
) WITH (
'connector' = 'kafka',
'topic' = 'ai_log',
'properties.bootstrap.servers' = 'alikafka',
'properties.group.id' = 'pyspark-consumer',
'scan.startup.mode' = 'latest-offset',
'format' = 'json'
);
SELECT
TUMBLE_START(event_time, INTERVAL '1' MINUTE) as window_start,
TUMBLE_END(event_time, INTERVAL '1' MINUTE) as window_end,
b as platform,
count(distinct cs1) as uv
from src_kafka
where n = 'ADCompanyShow'
and cs1 is not null
GROUP BY TUMBLE(event_time, INTERVAL '1' MINUTE),b
;
上述案例是要按照 每分钟的滚动窗口来统计埋点事件为 ADCompanyShow 的登录用户数量,以平台维度区分,从上图中可知 web 端每分钟登录用户数具体数值。
2 滑动窗口
滑动窗口(HOP),也被称作Sliding Window。不同于滚动窗口,滑动窗口的窗口可以重叠。
滑动窗口有两个参数:slide和size。slide为滑动步长,size为窗口大小。
- slide < size,则窗口会重叠,每个元素会被分配到多个窗口。
- slide = size,则等同于滚动窗口(TUMBLE)。
- slide > size,则为跳跃窗口,窗口之间不重叠且有间隙。
通常,大部分元素符合多个窗口情景,窗口是重叠的。因此,滑动窗口在计算移动平均数时很实用。例如,计算过去5分钟数据的平均值,每10秒钟更新一次,可以设置slide为10秒,size为5分钟。