Flink SQL之窗口JOIN

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);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值