flink滚动窗口代码讲解
重点:
你单独在kafka写入一批数据进行测试,它不会直接出结果,等你下批测试数据进来的时候他才会显示上一批数据的最终结果集
CREATE TABLE kafkaSource(
username string,
click_url string,
ts timestamp,
WATERMARK FOR ts as withOffset(ts,1000)
--ts必须是表中已定义的一列(当前仅支持为Timestamp类型),含义是基于该列生成 watermark,并且标识该列为 Event Time 列,可以在后续 query 中用来定义窗口。
--1000 代表偏移量(数据可以延迟时间) 相当于是1s
) WITH (
type='kafka',
kafka.bootstrap.servers='ip地址:端口号',
kafka.auto.offset.reset='latest',
kafka.topic='cui_test',
kafka.group.id='kafka_group',
dataType='json',
parallelism ='1'
);
CREATE TABLE cui_test(
username string,
start_time TIMESTAMP,
end_time TIMESTAMP,
clicks BIGINT
)WITH(
type='mysql',
url='jdbc:mysql://IP地址:端口号/库名?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true',
userName='库用户名',
password='库密码',
tableName='cui_test',
parallelism ='1'
);
insert into cui_test
select
username,
TUMBLE_START(ROWTIME, INTERVAL '1' MINUTE) as start_time, --窗口开始时间 定义eventtime 自动生成的
TUMBLE_END(ROWTIME, INTERVAL '1' MINUTE) as end_time, --创建结束时间 定义eventtime 自动生成的
COUNT(click_url) as clicks
from kafkaSource
GROUP BY TUMBLE(ROWTIME, INTERVAL '1' MINUTE), username;
往kafka写入测试数据
{"username":"Tom","click_url":"www.baidu.com","ts":"2021-02-20 16:20:05"}
5条
{"username":"Jack","click_url":"www.baidu.com","ts":"2021-02-20 16:20:10"}
3条
最终库结果
名称 窗口开始时间 窗口结束时间 次数
Tom 2021-02-20 16:20:00 2021-02-20 16:21:00 5
Jack 2021-02-20 16:20:00 2021-02-20 16:21:00 3