目录
1. 窗口(Window)
有了时间属性,接下来就可以定义窗口进行计算了。窗口可以将无界流切割成大小有限的桶来做计算,通过截取有限数据集来处理无限的流数据、
2. 窗口表值函数(Windowing TVFs)
窗口表值函数(table-valued functions)是Flink定义的多表函数(PTF),可以将表进行扩展后返回。
窗口表值函数可以完全替代传统的分组窗口函数,窗口TVF更符合SQL标准,性能得到了优化,拥有更强大的功能。可以支持基于窗口的复杂计算,例如窗口Top-N、窗口联结(window join)等。
在窗口TVF的返回值中,除去原始表中的所有列,还增加了用来描述窗口的额外3个列。窗口起始点(window_start)、窗口结束点(window_end)、窗口时间(window_time)。起始点和结束点比较好理解,窗口时间指的是窗口中的时间属性,它的值等于window_end - 1ms,所以相当于是窗口能够包含数据的最大时间戳。
2.1 滚动窗口(TUMBLE)
滚动窗口有固定的尺寸,窗口间的元素无重复
--语法
--基于时间字段ts,对表EventTable中的数据开了大小1小时的滚动窗口
TUMBLE(TABLE EventTable, DESCRIPTOR(ts), INTERVAL '1' HOUR)
--示例:每10分钟将10分钟内的金额汇总计算
--其中 watermark(`ts` - INTERVAL '1' SECOND )
SELECT window_start, window_end, SUM(price)
FROM TABLE(
TUMBLE(TABLE Bid, DESCRIPTOR(ts), INTERVAL '10' MINUTES))
GROUP BY window_start, window_end;
2.2 滑动窗口(HOP)
--语法
--其中第三个参数是步长slide 第四个参数才是窗口大小size
--基于时间属性ts,在表EventTable上创建了大小为1小时的滑动窗口,每5分钟滑动一次
HOP(TABLE EventTable, DESCRIPTOR(ts), INTERVAL '5' MINUTES, INTERVAL '1' HOURS)
--示例: 将10分钟内的金额汇总计算,并且每5分钟触发一次计算
--其中 watermark(`ts` - INTERVAL '1' SECOND )
SELECT window_start, window_end, SUM(price)
FROM TABLE(
HOP(TABLE Bid, DESCRIPTOR(ts), INTERVAL '5' MINUTES, INTERVAL '10' MINUTES))
GROUP BY window_start, window_end;
2.3 累计窗口(CUMULATE)
同一个窗口会按照步长逐步累计时间的形式,触发窗口计算操作
--语法
--第三个参数为步长step,第四个参数则是最大窗口长度(最大窗口长度其实就是我们所说的统计周期,最终目的就是统计这段时间内的数据)
--基于时间属性ts,在表EventTable上定义了一个统计周期为1天、累计步长为1小时的累积窗口
CUMULATE(TABLE EventTable, DESCRIPTOR(ts), INTERVAL '1' HOURS, INTERVAL '1' DAYS)
--示例: 每2分钟计算总金额,并在累积10分钟后,计算总金额
SELECT window_start, window_end, SUM(price)
FROM TABLE(
CUMULATE(TABLE Bid, DESCRIPTOR(ts), INTERVAL '2' MINUTES, INTERVAL '10' MINUTES))
GROUP BY window_start, window_end;