1.TUMBLE(滚动窗口)
滚动窗口有固定的尺寸,窗口间的元素无重复
语法:
TUMBLE(TABLE data, DESCRIPTOR(timecol), size [, offset ])
说明:
- data: 包含时间属性列的表
- timecol: 是一个列描述符,指示数据的哪个时间属性列应映射到滚动窗口
- size: 是指定滚动窗口宽度的持续时间。
- offset: 是一个可选参数,用于指定窗口将要开始的偏移量。
示例:每10分钟将10分钟内的金额汇总计算
# 其中 watermark(`bidtime` - INTERVAL '1' SECOND )
SELECT window_start, window_end, SUM(price)
FROM TABLE(
TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES))
GROUP BY window_start, window_end;
2.HOP(滑动窗口)
HOP函数将元素分配给固定长度的窗口。与TUMBLE窗口函数类似,窗口的大小由窗口大小参数配置。另一个窗口滑动参数控制跳转窗口的启动频率。
语法:
HOP(TABLE data, DESCRIPTOR(timecol), slide, size [, offset ])
说明:
- data: 包含时间属性列的表
- timecol: 是一个列描述符,指示数据的哪个时间属性列应该映射到滑动窗口
- slide: 每个滑动窗口创建的间隔时间
- size: 是指定滑动窗口宽度的持续时间
- offset: 是一个可选参数,用于指定窗口将要开始的偏移量。
示例:将10分钟内的金额汇总计算,并且每5分钟触发一次计算
# 其中 watermark(`bidtime` - INTERVAL '1' SECOND )
SELECT window_start, window_end, SUM(price)
FROM TABLE(
HOP(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '5' MINUTES, INTERVAL '10' MINUTES))
GROUP BY window_start, window_end;
3.CUMULATE(累积窗口)
CUMULATE函数有固定的窗口大小和步长,同一个窗口会按照步长逐步累计时间的形式,触发窗口计算操作,其他在同一窗口触发计算的多个滚动窗口有相同的window_start,window_end会累加步长的时间长度。
语法:
CUMULATE(TABLE data, DESCRIPTOR(timecol), step, size)
说明:
- data: 包含时间属性列的表
- timecol: 是一个列描述符,指示数据的哪个时间属性列应映射到滚动窗口。
- step: 是指定连续累积窗口结束之间增加的窗口大小的持续时间(步长)
- size: 是指定累积窗口的最大宽度的持续时间。大小必须是步长的整数倍。
- offset: 是一个可选参数,用于指定窗口将要开始的偏移量。
示例:每2分钟计算总金额,并在累积10分钟后,计算总金额
SELECT window_start, window_end, SUM(price)
FROM TABLE(
CUMULATE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '2' MINUTES, INTERVAL '10' MINUTES))
GROUP BY window_start, window_end;
4.窗口Join语法
窗口join将时间维度添加到join条件本身中。这样做时,窗口join将两个流的元素连接在一起,这两个流共享一个公共键并位于同一窗口中。窗口join的语义与DataStream窗口联接相同
特性:对于流式查询,与连续表上的其他join不同,窗口join不发出中间结果,而只在窗口结束时发出最终结果,后续延迟数据可能会丢失,实时性和准确性方面都相对较差。此外,窗口join在不再需要时清除所有中间状态
支持的join类型:INNER/LEFT/RIGHT/FULL OUTER/ANTI/SEMI JOIN
语法:
SELECT ...
FROM L [LEFT|RIGHT|FULL OUTER] JOIN R -- L and R are relations applied windowing TVF
ON L.window_start = R.window_start AND L.window_end = R.window_end AND ...
4.1 INNER/LEFT/RIGHT/FULL OUTER JOIN
SELECT L.num as L_Num, L.id as L_Id, R.num as R_Num, R.id as R_Id, L.window_start, L.window_end
FROM (
SELECT * FROM TABLE(TUMBLE(TABLE LeftTable, DESCRIPTOR(row_time), INTERVAL '5' MINUTES))
) L
FULL JOIN (
SELECT * FROM TABLE(TUMBLE(TABLE RightTable, DESCRIPTOR(row_time), INTERVAL '5' MINUTES))
) R
ON L.num = R.num AND L.window_start = R.window_start AND L.window_end = R.window_end;
4.2 SEMI JOIN
如果在公共窗口的右侧至少有一个匹配行,左窗口返回一行。
SELECT *
FROM (
SELECT * FROM TABLE(TUMBLE(TABLE LeftTable, DESCRIPTOR(row_time), INTERVAL '5' MINUTES))
) L
WHERE L.num IN (
SELECT num FROM (
SELECT * FROM TABLE(TUMBLE(TABLE RightTable, DESCRIPTOR(row_time), INTERVAL '5' MINUTES))
) R WHERE L.window_start = R.window_start AND L.window_end = R.window_end);
4.3 ANTI JOIN
返回左侧窗口没有右侧窗口没有匹配的数据
SELECT *
FROM (
SELECT * FROM TABLE(TUMBLE(TABLE LeftTable, DESCRIPTOR(row_time), INTERVAL '5' MINUTES))
) L
WHERE L.num NOT IN (
SELECT num FROM (
SELECT * FROM TABLE(TUMBLE(TABLE RightTable, DESCRIPTOR(row_time), INTERVAL '5' MINUTES))
) R WHERE L.window_start = R.window_start AND L.window_end = R.window_end);