FlinkSql系列4之OVER聚合

系列文章目录


前言

本节主要记录学习flinksql中的OVER聚合的使用,我们知道,对于GROUP BY来说,我们只能保留我们分组的字段,其他的字段是无法保留的,而对于OVER聚合来说我们可以实现保留全部的字段,不过在实际应用中,这个并不常用。

一、Over聚合实际测试

1.时间区间聚合

创建源表

CREATE TABLE source_table3(
--订单id
`order_id` BIGINT,
--产品
`product` BIGINT,
--金额
`amount` BIGINT,
--支付时间
`order_time` as CAST(CURRENT_TIMESTAMP AS TIMESTAMP(3)),`在这里插入代码片`
--WATERMARK
WATERMARK FOR order_time AS order_time - INTERVAL '2' SECOND
) WITH(
'connector' = 'datagen',
 'rows-per-second' = '1',
 'fields.order_id.min' = '1',
 'fields.order_id.max' = '2',
 'fields.amount.min' = '1',
 'fields.amount.max' = '10',
 'fields.product.min' = '1',
 'fields.product.max' = '2'
)

创建目标表

CREATE TABLE sink_table5(
--产品
`product` BIGINT,
--金额
`amount` BIGINT,
--支付时间
`order_time` TIMESTAMP(3)
--1分钟时间聚合总数
`one_minute_sum` BIGINT
) WITH(
'connector'='print'
)

执行sql 1

INSERT INTO sink_table5
SELECT
product,
amount,
order_time,
SUM(amount) OVER(
PARTITION BY product
ORDER BY order_time
-- 标识统计范围是1个 product 的最近 1 分钟的数据
RANGE BETWEEN INTERVAL '1' MINUTE PRECEDING AND CURRENT ROW
) as one_minute_sum
FROM source_table3;

在这里插入图片描述
执行sql2

INSERT INTO sink_table5
SELECT
order_id,
product,
amount,
order_time,
SUM(amount) OVER(
PARTITION BY product
ORDER BY order_time
-- 标识统计范围是1个 product 的最近 1 分钟的数据
RANGE BETWEEN INTERVAL '1' MINUTE PRECEDING AND CURRENT ROW
) as one_minute_sum
FROM source_table3;

在这里插入图片描述
可以看到我们可以按照窗口进行聚合,并且拿到了我们想要的字段!

2.行数聚合

源表和目标表和上文一样

执行sql

INSERT INTO sink_table5
SELECT
order_id,
product,
amount,order_time,
SUM(amount) OVER(
PARTITION BY product
ORDER BY order_time
--标识统计前五行的数据,因为是流,肯定只能统计前五行
ROWS BETWEEN 5 PRECEDING AND CURRENT ROW
) as one_minute_sum
FROM source_table3;

在这里插入图片描述
要注意的是这里我们选取前面几行,因为是实时数据,相当于不可能选后面的多少行的。

总结

本次对于OVER聚合函数进行总结
大概语法
SELECT
AGGREGATION(column) OVER(
PARTITION BY column
ORDER BY column
range选择(一段窗口时间,或者选取前几行)
)

ORDER BY:必须是时间戳列(事件时间、处理时间)
PARTITION BY:标识了聚合窗⼝的聚合粒度,如上述案例是按照 product 进⾏聚合
range_definition:这个标识聚合窗⼝的聚合数据范围,在 Flink 中有两种指定数据范围的⽅式。第⼀种 为 按照⾏数聚合 ,第⼆种为 按照时间区间聚合

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第一章 整体介绍 2 1.1 什么是 Table API 和 Flink SQL 2 1.2 需要引入的依赖 2 1.3 两种 planner(old & blink)的区别 4 第二章 API 调用 5 2.1 基本程序结构 5 2.2 创建表环境 5 2.3 在 Catalog 中注册表 7 2.3.1 表(Table)的概念 7 2.3.2 连接到文件系统(Csv 格式) 7 2.3.3 连接到 Kafka 8 2.4 表的查询 9 2.4.1 Table API 的调用 9 2.4.2 SQL 查询 10 2.5 将 DataStream 转换成表 11 2.5.1 代码表达 11 2.5.2 数据类型与 Table schema 的对应 12 2.6. 创建临时视图(Temporary View) 12 2.7. 输出表 14 2.7.1 输出到文件 14 2.7.2 更新模式(Update Mode) 15 2.7.3 输出到 Kafka 16 2.7.4 输出到 ElasticSearch 16 2.7.5 输出到 MySql 17 2.8 将表转换成 DataStream 18 2.9 Query 的解释和执行 20 1. 优化查询计划 20 2. 解释成 DataStream 或者 DataSet 程序 20 第三章 流处理中的特殊概念 20 3.1 流处理和关系代数(表,及 SQL)的区别 21 3.2 动态表(Dynamic Tables) 21 3.3 流式持续查询的过程 21 3.3.1 将流转换成表(Table) 22 3.3.2 持续查询(Continuous Query) 23 3.3.3 将动态表转换成流 23 3.4 时间特性 25 3.4.1 处理时间(Processing Time) 25 3.4.2 事件时间(Event Time) 27 第四章 窗口(Windows) 30 4.1 分组窗口(Group Windows) 30 4.1.1 滚动窗口 31 4.1.2 滑动窗口 32 4.1.3 会话窗口 32 4.2 Over Windows 33 1) 无界的 over window 33 2) 有界的 over window 34 4.3 SQL 中窗口的定义 34 4.3.1 Group Windows 34 4.3.2 Over Windows 35 4.4 代码练习(以分组滚动窗口为例) 36 第五章 函数(Functions) 38 5.1 系统内置函数 38 5.2 UDF 40 5.2.1 注册用户自定义函数 UDF 40 5.2.2 标量函数(Scalar Functions) 40 5.2.3 表函数(Table Functions) 42 5.2.4 聚合函数(Aggregate Functions) 45 5.2.5 表聚合函数(Table Aggregate Functions) 47

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值