Flink SQL之窗口JOIN

本文介绍了流处理中的三种时间窗口函数:TUMBLE(滚动窗口)、HOP(滑动窗口)和CUMULATE(累积窗口),以及它们的语法、参数和使用示例。此外,还讨论了窗口Join的概念,包括INNER、LEFT、RIGHT、FULLOUTER、SEMI和ANTIJOIN的类型,强调了窗口Join在实时性和准确性上的特点以及中间结果的处理方式。
摘要由CSDN通过智能技术生成

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

Flink SQL中的JOIN操作可以和窗口一起使用,实现窗口上的JOIN计算,这可以在实时流处理中非常有用。 窗口是数据流处理中的一种重要概念,它可以将数据流按照时间或者数量等维度进行切分,然后对每个窗口内的数据进行计算。Flink SQL中支持多种类型的窗口,如滚动窗口、滑动窗口、会话窗口等。 在使用Flink SQL进行JOIN操作时,可以将JOIN条件和窗口条件进行结合,以获取更加精细的数据切分和计算结果。例如,可以将两个数据流按照时间窗口进行JOIN操作,计算出在指定时间窗口内符合条件的数据。 具体来说,Flink SQL中的JOIN操作和窗口的结合有以下几个步骤: 1. 定义窗口:使用Flink SQL中的窗口函数,对数据流进行窗口切分,定义窗口大小和滑动步长等参数。 2. 分区数据:将数据流按照JOIN条件进行分区,将不同数据流中符合条件的数据分配到同一个计算节点上。 3. 缓存数据:将分区后的数据缓存到内存或者磁盘中,以供后续的JOIN计算使用。 4. JOIN计算:对缓存的数据按照JOIN条件进行JOIN计算,同时按照窗口条件进行分组计算,计算出符合条件的数据。 5. 输出结果:将JOIN计算的结果输出到指定的目标位置,以供后续的查询分析使用。 总的来说,Flink SQL中的JOIN操作和窗口的结合可以实现更加精细的数据切分和计算,可以在实时流处理中实现更加复杂的数据分析和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值