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

本文深入探讨Flink SQL中的TimeWindow,包括Tumble、Hop和Session窗口类型,以及WindowOperator的创建和数据处理流程。通过源码分析,解释了WindowOperator如何处理数据、注册Timer,以及触发器的工作机制。文章还提供了示例代码和触发策略的详细解释。
摘要由CSDN通过智能技术生成

文章目录

一、概述

二、Window分类

1、TimeWindow与CountWindow

2、TimeWindow子类型

Tumble Window(翻转窗口)

Hop Window(滑动窗口)

Session Window(会话窗口)

三、Window分类及整体流程

四、创建WindowOperator算子

五、WindowOperator处理数据图解

六、WindowOperator源码调试

1、StreamExecGroupWindowAggregate#createWindowOperator()创建算子

2、WindowOperator#processElement()处理数据,注册Timer

3、Timer触发

InternalTimerServiceImpl#advanceWatermark()

WindwOperator#onEventTime()

emitWindowResult()提交结果

七、Emit(Trigger)触发器

1、Emit策略

2、用途

3、语法

4、示例

5、Trigger类和结构关系

概述

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

本文内容:

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)两种,接来下依次介绍。

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)

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进行分析。

Hop Window(滑动窗口)

滑动窗口Assigner将元素分配给多个固定长度的窗口。类似于滚动窗口分配程序,窗口的大小由窗口大小参数配置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值