Flink源码分析--(二)FLink SQL Window功能

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一、概述

窗口是无限流上一种核心机制,可以流分割为有限大小的“窗口”,同时,在窗口内进行聚合,从而把源源不断产生的数据根据不同的条件划分成一段一段有边界的数据区间,使用户能够利用窗口功能实现很多复杂的统计分析需求。

本文内容:

  • Flink SQL WINDOW功能介绍
  • 底层实现源码分析:StreamExecGroupWindowAggregate创建WindowOperator
  • 底层实现源码分析:WindowOperator算子处理数据这两个地方源码分析。

二、Window分类

1、TimeWindow与CountWindow

Flink Window可以是时间驱动的(TimeWindow),也可以是数据驱动的(CountWindow)

由于flink-planner-blink SQL中目前只支持TimeWindow相应的表达语句(TUMBLE、HOP、SESSION),因此,本文主要介绍TimeWindow SQL示例和逻辑,CountWindow感兴趣的读者可自行分析。

2、TimeWindow子类型

Flink TimeWindow有滑动窗口(HOP)、滚动窗口(TUMBLE)以及会话窗口(SESSION)三种,所选取的字段时间,可以是系统时间(PROCTIME)或事件时间(EVENT TIME)两种,接来下依次介绍

I、Tumble Window(翻转窗口)

翻转窗口Assigner将每个元素分配给具有指定大小的窗口。翻转窗口的大小是固定的,且不会重叠。例如,指定一个大小为5分钟的翻滚窗口,并每5分钟启动一个新窗口,如下图所示

在这里插入图片描述
TUMBLE ROWTIME语法示例:

CREATE TABLE sessionOrderTableRowtime (
	ctime TIMESTAMP,
	categoryName VARCHAR,
	shopName VARCHAR,
	itemName VARCHAR,
	userId VARCHAR,
	price FLOAT,
	action BIGINT,
	WATERMARK FOR ctime AS withOffset(ctime, 1000),
	proc AS PROCTIME()
) with (
	`type` = 'kafka',
	format = 'json',
	updateMode = 'append',
	`group.id` = 'groupId',
	bootstrap.servers = 'xxxxx:9092',
	version = '0.10',
	`zookeeper.connect` = 'xxxxx:2181',
	startingOffsets = 'latest',
	topic = 'sessionsourceproctime'
);


CREATE TABLE popwindowsink (
	countA BIGINT,
	ctime_start TIMESTAMP,
	ctime_end VARCHAR,
	ctime_rowtime VARCHAR,
	categoryName VARCHAR,
	price_sum FLOAT
) with (
	format = 'json',
	updateMode = 'append',
	bootstrap.servers = 'xxxxx:9092',
	version = '0.10',
	topic = 'sessionsinkproctime',
	`type` = 'kafka'
);

INSERT INTO popwindowsink
(SELECT
COUNT(*),
TUMBLE_START(ctime, INTERVAL '5' MINUTE),
DATE_FORMAT(TUMBLE_END(ctime, INTERVAL '5' MINUTE), 'yyyy-MM-dd-HH-mm-ss:SSS'), --将TUMBLE_END转为可视化的日期
DATE_FORMAT(TUMBLE_ROWTIME(ctime, INTERVAL '5' MINUTE), 'yyyy-MM-dd-HH-mm-ss:SSS'), --这里TUMBLE_ROWTIME为TUMBLE_END-1ms,一般用于后续窗口级联聚合
categoryName,
SUM(price)
FROM sessionOrderTableRowtime
GROUP BY TUMBLE(ctime, INTERVAL '5' MINUTE), categoryName)

TUMBLE_ROWTIME、TUMBLE_PROCTIME、HOP_ROWTIME的使用介绍可参考阿里流计算相应文章:https://help.aliyun.com/document_detail/62511.html?spm=a2c4g.11186623.6.644.65ff18a0DKJzwG

TUMBLEP ROCTIME语法示例:

INSERT INTO popwindowsink
(SELECT
COUNT(*),
TUMBLE_START(proc, INTERVAL '5' MINUTE),
DATE_FORMAT(TUMBLE_END(proc, INTERVAL '5' MINUTE), 'yyyy-MM-dd-HH-mm-ss:SSS'),
DATE_FORMAT(TUMBLE_PROCTIME(proc, INTERVAL '5' MINUTE), 'yyyy-MM-dd-HH-mm-ss:SSS'), --注意这里proc字段即Source DDL中指定的PROCTIME
categoryName,
SUM(price)
FROM sessionOrderTableRowtime
GROUP BY TUMBLE(proc, INTERVAL '5' MINUTE), categoryName)

ROWTIME与PROCTIME区别:

  • 在使用上: 主要是填入的ctime、proc关键字的区别,这两个字段在Source DDL中指定方式不一样
  • 在实现原理上: ROWTIME模式,根据ctime对应的值,去确定窗口的start、end;PROCTIME模式,在WindowOperator处理数据时,获取本地系统时间,去确定窗口的start、end

由于生产系统中,主要使用ROWTIME来计算、聚合、统计,PROCTIME一般用于测试或对统计精度要求不高的场景,本文后续都主要以ROWTIME进行分析

II、Hop Window(滑动窗口)

滑动窗口Assigner将元素分配给多个固定长度的窗口。类似于滚动窗口分配程序,窗口的大小由窗口大小参数配置。因此,如果滑动窗口小于窗口大小,则滑动窗口可以重叠。在这种情况下,元素被分配到多个窗口。其实,滚动窗口TUMBLE是滑动窗口的一个特例。
例子,设置一个10分钟长度的窗口,以5分钟间隔滑动。这样,每5分钟就会出现一个窗口,其中包含最近10分钟内到达的事件,如下图:

在这里插入图片描述
HOP ROWTIME语法示例:

INSERT INTO popwindowsink
(SELECT
COUNT(*),
HOP_START(ctime, INTERVAL '5' MINUTE,  INTERVAL '10' MINUTE),
DATE_FORMAT(HOP_END(ctime, INTERVAL '5' MINUTE,  INTERVAL '10' MINUTE), 'yyyy-MM-dd-HH-mm-ss:SSS'),
DATE_FORMAT(HOP_ROWTIME(ctime, INTERVAL '5' MINUTE,  INTERVAL '10' MINUTE), 'yyyy-MM-dd-HH-mm-ss:SSS'), --注意这里ctime字段即Source DDL中指定的ROWTIME
categoryName,
SUM(price)
FROM sessionOrderTableRowtime
GROUP BY HOP(ct
FlinkSQLWindowing TVF Flink1.13版本之后出现的替代之前的Group window的产物,官网描述其 is more powerful and effective 阅读详情

相关推荐

FLink 源码分析--(三)Time Window Join

文章目录一、概述1、SQL的优势2、FLink SQL 核心功能3、Flink Join的分类 一、概述 1、SQL的优势 在介绍Time Window Join前,可以先看看Flink SQL相关的整体介绍和架构: 声明式:用户只需要表达我想要什么,至于怎么计算那是系统的事情,用户不用关心。 自动调优。查询优化器可以为用户的 SQL 生成最有的执行计划。用户不需要了解它,就能自动享受优化器...

LS_ice的专栏 2188

flink hop window测试

从实例的角度来测试一遍hop window(滑动窗口),这里使用了官方文档中窗口函数的表结构及数据,从实际操作来看滑动窗口何时开启关闭,以及watermark对窗口的作用。

csdntestuser1的博客 2143

flinksql获取系统当前时间搓_Flink SQL Window源码全解析

文章目录一、概述Window分类1、TimeWindow与CountWindow2、TimeWindow子类型Tumble Window(翻转窗口)Hop Window(滑动窗口)Session Window(会话窗口)三、Window分类及整体流程四、创建WindowOperator算子五、WindowOperator处理数据图解六、WindowOperator源码调试1、StreamExe...

weixin_39552179的博客 776

大数据Flink(九十六):DML:Deduplication

Deduplication 其实就是去重,也即上文介绍到的 TopN 中 row_number = 1 的场景,但是这里有一点不一样在于其排序字段一定是时间属性列,不能是其他非时间属性的普通列。在 row_number = 1 时,如果排序字段是普通列 planner 会翻译成 TopN 算子,如果是时间属性列 planner 会翻译成 Deduplication,这两者最终的执行算子是不一样的,Deduplication 相比 TopN 算子专门做了对应的优化,性能会有很大提升。可以看到其有回撤数据。

Lansonli(蓝深李)的博客 810

FlinkSql中窗口(window)的使用

FlinkSql中窗口(window)的使用 时间语义,要配合窗口操作才能发挥作用。最主要的用途,当然就是开窗口然后根据时间段做计算了。 在Table API和SQL中,主要有两种窗口:Group Windows和Over Windows 一、Table API中使用窗口 Group Windows 分组窗口(Group Windows)会根据时间或行计数间隔,将行聚合到有限的组(Group)中,并对每个组的数据执行一次聚合函数。 Table API中的Group Windows都是使用.window(w:

weixin_42796403的博客 4839

Flink SQL时间属性和窗口介绍 ,窗口表值函数

在创建表的 DDL(CREATE TABLE 语句)中,可以增加一个字段,通过 WATERMARK语句来定义事件时间属性。WATERMARK 语句主要用来定义水位线(watermark)的生成表达式,这个表达式会将带有事件时间戳的字段标记为事件时间属性,并在它基础上给出水位线的延迟时间。具体定义方式如下:) WITH (...把 ts 字段定义为事件时间属性,而且基于 ts 设置了 5 秒的水位线延迟。

. 3069

Flink SQL Window源码全解析

文章目录 一、概述 Window分类 1、TimeWindow与CountWindow 2、TimeWindow子类型 Tumble Window(翻转窗口) Hop Window(滑动窗口) Session Window(会话窗口) 三、Window分类及整体流程 四、创建WindowOperator算子 五、WindowOperator处理数据图解 六、WindowOperator...

微信搜:import_bigdata,大数据领域硬核原创作者 1202

解决Flink1.9.0源码中,SourceTable中有EventTime,执行Window报错

文章目录一、window报错问题描述、报错相关Flink源码分析1、StreamLogicalWindowAggregateRule的作用2、StreamLogicalWindowAggregateRule#getTimeFieldReference()方法分析3、创建TimeIndicatorRelDataType过程4、TableSourceTable#getRowType()设置字段类型三...

LS_ice的专栏 5245

Flink-SQL源码解读(一)window算子的创建的源码分析

本文大体框架参考 https://blog.csdn.net/LS_ice/article/details/90711744 flink版本:1.9 Intro 作为无限流的核心机制,流可以分割为大小有限的窗口,通过在窗口内进行聚合。把源源不断产生的数据根据不同的条件划分成一段一段有边界的数据区间,使用户能够利用窗口功能实现很多复杂的统计分析需求。 windowOperator算子的创建架构 w...

小凯的博客 1754

易语言向指定窗口按键源码_Flink SQL Window源码全解析

大数据技术与架构点击右侧关注,大数据开发领域最强公众号!暴走大数据点击右侧关注,暴走大数据!文章目录一、概述Window分类1、TimeWindow与CountWindow2、TimeWindow子类型Tumble Window(翻转窗口)Hop Window(滑动窗口)Session Window(会话窗口)三、Window分类及整体流程四、创建WindowOperator算子五、...

weixin_39997695的博客 428

[源码分析] 带你梳理 Flink SQL / Table API内部执行流程

本文将简述Flink SQL / Table API的内部实现,为大家把 "从SQL语句到具体执行" 这个流程串起来。并且尽量多提供调用栈,这样大家在遇到问题时就知道应该从什么地方设置断点,对整体架构理解也能更加深入。

罗西的思考 995

Flink实战 - 周窗口-week window实现

遇到的问题:

m0_49826240的博客 1142

Flink join 不同join案例介绍和总结

类似与普通的两张表关联,当左右表任何一张表有数据变化时,最终关联的结果会进行更新,如这篇文章里面的示例图: SELECT id, price, name FROM Price_Table A Left Outer JOIN Name_Table B ON A.id = B.id ①–⑥号输入数据,代表随时间增加,按顺序输入事件到左、右侧流。 ①–⑥号输入数据,可以对应到最右侧Join后输出数据,-号代表回撤,+号代表最新数据 输入数据会更新左、右侧状态数据(内部一般都是MapState实现,如..

litlit023的专栏 905

Flink SQL "doesn't support consuming update and delete changes" 错误谈起

前言 相信我们在初学Flink SQL时,多少遇到过像这样的错误信息: org.apache.flink.table.api.TableException: X[算子名] doesn't support consuming update and delete changes which is produced by node Y[算子名] 为什么有些下游算子不能接受上游算子发来的UPDATE和D...

LittleMagic's Blog 1万+

FlinkSql的窗口使用以及运用案例

窗口概述 窗口函数 窗口分类

m0_46507516的博客 4199

阿里云实时计算平台Flink报错汇总

一、报错问题 1.2022.04.14记录 全托管实时计算平台 所有cdc模式都不支持窗口,如果加上cdc模式会报错: org.apache.flink.table.api.TableException: StreamPhysicalWindowAggregate doesn't support consuming update and delete changes which is produced by node TableSourceScan(table=[[vvp, dwd, holo_d

qq_36250202的博客 4455

Flink 实战篇】窗口实战:TUMBLE、HOP、SESSION

在流式计算中,流通常是无穷无尽的,我们无法知道什么时候数据源会继续 / 停止发送数据,所以在流上处理聚合事件(count、sum 等)的处理方式与批处理中的处理方式会有所差异。在流上一般用窗口(Window)来限定聚合的范围,例如 “过去 2 分钟网站点击量的计数”、“在最近 100 个人中点赞这个视频的总人数”。窗口的概念相当于帮我们收集了一张有限数据的动态表,我们可以对表中的数据进行聚合计算。

Code · Cloud · Think · Repeat 3082

flink window 框架详细解读

flink window整体框架解读,dataStream window / sql window 函数使用说明,window tvf,group window over window最全使用,window tvf解决替代场景及优化地方

weixin_40954192的博客 838
上一篇: Flink源码分析--(一)异步I/O访问外部数据:AsyncWaitOperator
下一篇: 解决Flink1.9.0源码中,SourceTable中有EventTime,执行Window报错
LS_ice
博客等级 码龄16年 70粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值