FlinkSql系列1之窗口聚合

FlinkSql之窗口聚合


前言

使用flink datastream我们都知道有可以进行开窗聚合处理,今天记录一下flinksql的窗口聚合学习。

一、窗口聚合的分类

滚动窗口(Tumble)
滑动窗口(HOP)
Session窗口(Session)
渐进式窗口(CUMULATE)

二、窗口实际案例与实践

2.1.滚动窗口(TUMBLE)

创建源表

CREATE TABLE source_table(
--维度数据
`city_id` STRING,
--用户id
`user_id` BIGINT,
--金额
`price` BIGINT,
--事件时间戳
`rowtime` AS CAST(CURRENT_TIMESTAMP AS timestamp(3)),
--watermark设置
WATERMARK FOR rowtime AS rowtime - INTERVAL '3' second
)WITH (
 'connector' = 'datagen',
 'rows-per-second' = '5',
 'fields.city_id.length' = '1',
 'fields.user_id.min' = '1',
 'fields.user_id.max' = '50',
 'fields.price.min' = '1',
 'fields.price.max' = '50'
);

创建目标表

CREATE TABLE sink_table(
--维度数据
`city_id` STRING,
--pv pagevisit
`pv` BIGINT,
--总金额
`sum_price` BIGINT,
--最大金额
`max_price` BIGINT,
--最小金额
`min_price` BIGINT,
--uv 去重
`uv` BIGINT,
--窗口开始时间
`winodwstart` BIGINT,
--窗口结束时间
`windowend` BIGINT
) WITH (
'connector'='print'
)

group window aggregation

flink 1.13版本之前支持这种方式

INSERT INTO sink_table
SELECT
city_id,
COUNT(user_id) as pv,
COUNT(price) as sum_price,
MAX(price) as max_price,
MIN(price) as min_price,
COUNT(DISTINCT user_id) as uv,
UNIX_TIMESTAMP(CAST(TUMBLE_START(rowtime,INTERVAL '5' SECOND) AS STRING)) * 1000 as winodwstart,
UNIX_TIMESTAMP(CAST(TUMBLE_END(rowtime,INTERVAL '5' SECOND) AS STRING)) * 1000 as windowend
FROM source_table
GROUP BY
city_id,
TUMBLE(rowtime,INTERVAL '5' SECOND)

window tvf方案(只支持Streaming)

INSERT INTO sink_table
SELECT
city_id,
COUNT(user_id) as pv,
COUNT(DISTINCT user_id) as uv,
COUNT(price) as sum_price,
MAX(price) as max_price,
MIN(price) as min_price,
UNIX_TIMESTAMP(CAST(window_start AS STRING)) * 1000 as window_start,
UNIX_TIMESTAMP(CAST(window_end AS STRING)) * 1000 as window_end
FROM TABLE(TUMBLE(
TABLE source_table,
DESCRIPTOR(rowtime),
INTERVAL '5' SECOND
))
GROUP BY
window_start,
window_end,
city_id

第⼀个参数 TABLE source_table 声明数据源表;
第⼆个参数 DESCRIPTOR(row_time) 声明数据源的时间戳;
第三个参数 INTERVAL ‘5’ SECOND 声明滚动窗⼝⼤⼩为 5s。

2. 2.测试运行

在这里插入图片描述
两种方法都可以,但是尽量1.13版本之后建议使用window tvf方案

2.3 滑动窗口(HOP)

创建目标表

CREATE TABLE sink_table1(
--维度数据
`city_id` STRING,
--uv 去重
`uv` BIGINT
--窗口开始时间
`window_start`,
--窗口结束时间
`window_end`
)WITH (
'connector'='print'
)

group window aggregation

INSERT INTO sink_table1
SELECT
city_id,
COUNT(DISTINCT user_id) as uv,
UNIX_TIMESTAMP(CAST(HOP_START(rowtime,INTERVAL '5' SECOND,INTERVAL '10' SECOND) AS STRING)) * 1000 as window_start,
UNIX_TIMESTAMP(CAST(HOP_END(rowtime,INTERVAL '5' SECOND,INTERVAL '10' SECOND) AS STRING)) * 1000 as window_end
FROM source_table
GROUP BY
city_id,
--十秒的滑动窗口,每5秒进行一次滑动,并触发计算,有窗口重叠
HOP(rowtime,INTERVAL '5' SECOND,INTERVAL '10' SECOND);

window tvf方案

INSERT INTO sink_table1
SELECT
city_id,
COUNT(DISTINCT user_id) as uv,
UNIX_TIMESTAMP(CAST(window_start AS STRING)) * 1000 as window_start,
UNIX_TIMESTAMP(CAST(window_end AS STRING)) * 1000 as window_end
--十秒的滑动窗口,每5秒进行一次滑动,并触发计算,有窗口重叠
FROM TABLE(HOP(
TABLE source_table,
DESCRIPTOR(rowtime),
INTERVAL '5' SECOND,
INTERVAL '10' SECOND
))
GROUP BY 
city_id,
window_start,
window_end

2.4 测试结果

在这里插入图片描述

2.5 Session窗口(Session)

创建目标表

CREATE TABLE sink_table2(
--维度数据
`city_id` STRING,
--pv 计算每个session窗口内的商品数量
`pv` BIGINT
--窗口开始时间
`window_start`,
--窗口结束时间
`window_end`
)WITH(
'connector'='print'
)

执行sql统计每五秒的会话窗口 windowaggregation

INSERT INTO sink_table2
SELECT
city_id,
COUNT(user_id) as pv,
UNIX_TIMESTAMP(CAST(SESSION_START(rowtime,INTERVAL '5' SECOND) AS STRING)) * 1000 as window_start,
UNIX_TIMESTAMP(CAST(SESSION_END(rowtime,INTERVAL '5' SECOND) AS STRING))* 1000 as window_end
FROM source_table
GROUP BY 
city_id,
SESSION(rowtime,INTERVAL '5' SECOND)

2.6 测试结果

在这里插入图片描述
使用Window tvf的方式测试报错

在这里插入图片描述

2.7 渐进式窗口(CUMULATE)

创建源表

CREATE TABLE  source_table1(
--用户id
`user_id` STRING,
--消费金额
`money` BIGINT,
--事件时间
`rowtime` AS CAST(CURRENT_TIMESTAMP AS TIMESTAMP(3)),
--指定watermark
WATERMARK FOR rowtime AS rowtime - INTERVAL '2' SECOND
)WITH (
 'connector' = 'datagen',
 'rows-per-second' = '5',
 'fields.user_id.length' = '1',
 'fields.money.min' = '1',
 'fields.money.max' = '50'
)

创建目标表

CREATE TABLE sink_table3(
--用户id总数 去重
`usernum` STRING,
--窗口内总金额数量
`summoney` BIGINT,
--窗口开始时间
`window_start` BIGINT--窗口结束时间
`window_end` BIGINT
)WITH (
'connector'='print'
)

执行sql插入,注意这里1.13(streaming)只能使用window tvf模式

INSERT INTO sink_table3
SELECT
COUNT(DISTINCT user_id) as usernum,
COUNT(money) as summoney,
UNIX_TIMESTAMP(CAST(window_start AS STRING)) * 1000 as window_start,
UNIX_TIMESTAMP(CAST(window_end AS STRING)) * 1000 as window_end
FROM TABLE(CUMULATE(
TABLE source_table1,
DESCRIPTOR(rowtime),
INTERVAL ‘5’ SECOND,
INTERVAL ‘20’ SECOND
))
GROUP BY
window_start,
window_end

第⼀个参数 TABLE source_table 声明数据源表;
第⼆个参数 DESCRIPTOR(row_time) 声明数据源的时间戳;
第三个参数 INTERVAL ‘5’ SECOND 声明渐进式窗⼝触发的渐进步⻓为 5s。
第四个参数 INTERVAL ‘20’ SECOND 声明整个渐进式窗⼝的⼤⼩为 20 s,到了20s新开⼀个窗⼝重新累计。

2.8 测试结果

在这里插入图片描述

总结

本次对于flinksql里面的四个窗口分别进行了演示
1.滚动窗⼝:将每个元素指定给指定窗⼝⼤⼩的窗⼝。滚动窗⼝具有固定⼤⼩,且不重叠
2.滑动窗口:滑动窗⼝也是将元素指定给固定⻓度的窗⼝。与滚动窗⼝功能⼀样,也有窗⼝⼤⼩的概 念。不⼀样的地⽅在于,滑动窗⼝有另⼀个参数控制窗⼝计算的频率(滑动窗⼝滑动的步⻓)。因此,如果 滑动的步⻓⼩于窗⼝⼤⼩,则滑动窗⼝之间每个窗⼝是可以重叠。在这种情况下,⼀条数据就会分配到多个 窗⼝当中。
3.会话窗口:Session 时间窗⼝和滚动、滑动窗⼝不⼀样,其没有固定的持续时间,如果在定义 的间隔期(Session Gap)内没有新的数据出现,则 Session 就会窗⼝关闭
4.渐进式窗口:渐进式窗⼝在其实就是 固定窗⼝间隔内提前触发的的 滚动窗⼝ ,其实就是 Tumble Window + early-fire 的⼀个事件时间的版本。

这里需要注意尽量使用Window TVF模式,但是会话窗口的好像只能支持Window AGGREGATION.其他的均可以只是Window TVF模式。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flink SQL 中的窗口是将无限数据流划分为有限大小的块,以便进行有限的处理和聚合窗口可以按照时间或数据数量进行定义。Flink SQL 支持以下类型的窗口: 1. 滚动窗口(Tumbling Window):滚动窗口是一系列固定大小的、不重叠的时间段,按照固定的时间长度进行滚动,例如每 5 秒一个窗口。 2. 滑动窗口(Sliding Window):滑动窗口是一系列大小固定、可以有重叠的时间段,按照固定的时间长度进行滑动,例如每 5 秒滑动一次,窗口大小为 10 秒。 3. 会话窗口(Session Window):会话窗口是一组活动时间段的集合,这些时间段之间的间隔小于或等于指定的时间长度。会话窗口不需要固定的窗口长度,而是根据数据本身的属性动态计算。 Flink SQL 中的窗口可以通过以下语法进行定义: ```sql SELECT ... FROM ... WHERE ... GROUP BY ... WINDOW <window_type> ( <window_property> ) ``` 其中,`<window_type>` 可以是 `TUMBLING`, `SLIDING` 或 `SESSION`,`<window_property>` 取决于窗口类型,例如: - 对于滚动窗口,可以使用 `SIZE` 或 `TIME` 参数指定窗口大小或时间长度,例如 `WINDOW TUMBLING (SIZE 5 MINUTES)`。 - 对于滑动窗口,可以使用 `SIZE` 和 `SLIDE` 参数分别指定窗口大小和滑动步长,例如 `WINDOW SLIDING (SIZE 5 MINUTES, SLIDE 1 MINUTE)`。 - 对于会话窗口,可以使用 `GAP` 参数指定最大间隔时间,例如 `WINDOW SESSION (GAP 5 MINUTES)`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值