FlinkSql,如何开窗,如何进行窗口内计算

Flink SQL中的窗口函数 1 OVER窗口       OVER窗口(OVER Window)是传统数据库的标准开窗,不同于GROUP BY Window,OVER Window中的每一个元素都对应一个窗口。窗口元素是与当前元素相邻的元素集合,流数据元素分布在多个窗口中。在Flink SQL Window的实现中,每个触发计算的元素所确定的行,都是该元素所在窗口的最优一行。       在应用OVER Window 阅读详情

目录

准备一个表

 开窗

对开窗后的数据进行查询

对窗口内的数据进行聚合运算

对窗口数据使用OVER聚合(窗口函数)

对两个开窗表进行join


注意flink版本,我之前用的1.13.0,这一部分代码可能会有bug,而且13版本不支持Window join 我的版本是1.14.3_2.12

准备一个表

Flink SQL>  CREATE TEMPORARY TABLE Bid( 
  bidtime TIMESTAMP,
  price DECIMAL(10, 2),
  item STRING,
  watermark for bidtime as bidtime  - INTERVAL '1' SECOND
) WITH (
  'connector' = 'kafka',  
  'topic' = 'flink_test', 
  'properties.bootstrap.servers' = 'hdp01:6667', 
  'properties.group.id' = 'park_test_group1', 
  'scan.startup.mode' = 'latest-offset',
  'value.format'='json',
  'value.json.fail-on-missing-field' = 'false',
  'value.json.ignore-parse-errors' = 'true',
)

Flink SQL> desc Bid;
+-------------+------------------------+------+-----+--------+---------------------------------+
|        name |                   type | null | key | extras |                       watermark |
+-------------+------------------------+------+-----+--------+---------------------------------+
|     bidtime | TIMESTAMP(3) *ROWTIME* | true |     |        | `bidtime` - INTERVAL '1' SECOND |
|       price |         DECIMAL(10, 2) | true |     |        |                                 |
|        item |                 STRING | true |     |        |                                 |
+-------------+------------------------+------+-----+--------+---------------------------------+

字段类型转换 bigint 如何作为watermark 

TO_TIMESTAMP_LTZ(ts,3) 

TO_TIMESTAMP_LTZ(numeric, precision)toTimestampLtz(NUMERIC, PRECISION)Converts a epoch seconds or epoch milliseconds to a TIMESTAMP_LTZ, the valid precision is 0 or 3, the 0 represents TO_TIMESTAMP_LTZ(epochSeconds, 0), the 3 represents TO_TIMESTAMP_LTZ(epochMilliseconds, 3).
create table page_log(
    page map<string,string>,
    ts bigint,
    rt TO_TIMESTAMP_LTZ(ts,3), 
    WATERMARK FOR `rt` As `rt` - INTERVAL 2 'SECOND
)

 开窗

将表应用一下TVF(table-valued function )函数,返回一个开窗的表,开窗TVF函数目前有三个

  • TUMBLE
    • TUMBLE(TABLE data, DESCRIPTOR(timecol), size)
  • HOP
    • HOP(TABLE data, DESCRIPTOR(timecol), slide, size [, offset ])
  • CUMULATE
    • ​CUMULATE(TABLE data, DESCRIPTOR(timecol), step, size)

对开窗后的数据进行查询,目前只有以下三种方式

准备数据

{"bidtime":"2020-04-15 08:05","price":4.00,"item":"C","supplier_id":"supplier1"}
{"bidtime":"2020-04-15 08:07","price":2.00,"item":"A","supplier_id":"supplier1"}
{"bidtime":"2020-04-15 08:09","price":5.00,"item":"D","supplier_id":"supplier2"}
{"bidtime":"2020-04-15 08:11","price":3.00,"item":"B","supplier_id":"supplier2"}
{"bidtime":"2020-04-15 08:13","price":1.00,"item":"E","supplier_id":"supplier1"}
{"bidtime":"2020-04-15 08:17","price":6.00,"item":"F","supplier_id":"supplier2"}
{"bidtime":"2020-04-15 08:27","price":6.00,"item":"F","supplier_id":"supplier2"}

以最简单的Tumble,滚动窗口作为例子,无论什么开窗方式,查询方法是一样的

3种使用方式

对窗口内的数据进行聚合运算

问题:每10分钟求最近10分钟的总交易额

SELECT window_start, window_end, SUM(price) as sum_price
FROM TABLE(
     TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES)
)
-- group by 中必须携带 window_start, window_end
GROUP BY window_start, window_end

+----+-------------------------+-------------------------+------------------------------------------+
| op |            window_start |              window_end |                                sum_price |
+----+-------------------------+-------------------------+------------------------------------------+
| +I | 2020-04-15 08:00:00.000 | 2020-04-15 08:10:00.000 |                                    11.00 |
| +I | 2020-04-15 08:10:00.000 | 2020-04-15 08:20:00.000 |                                    10.00 |

对窗口数据使用OVER聚合(窗口函数)

问题:每10分钟求最近10分钟交易额最大的前2条记录

SELECT * from (SELECT 
    bidtime,
    price,
    item,
    supplier_id,
    window_start, 
    window_end, 
    row_number() over(partition by window_start, window_end order by price desc) as row_num 
 FROM TABLE(TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES))
) where row_num < 3
+----+-------------------------+------+-----+------------+-------------------------+-------------------------+---------+
| op |                 bidtime |price |item |supplier_id |            window_start |              window_end | row_num |
+----+-------------------------+------+-----+------------+-------------------------+-------------------------+---------+
| +I | 2020-04-15 08:09:00.000 | 5.00 |   D |  supplier2 | 2020-04-15 08:00:00.000 | 2020-04-15 08:10:00.000 |       1 |
| +I | 2020-04-15 08:05:00.000 | 4.00 |   C |  supplier1 | 2020-04-15 08:00:00.000 | 2020-04-15 08:10:00.000 |       2 |
| +I | 2020-04-15 08:17:00.000 | 6.00 |   F |  supplier2 | 2020-04-15 08:10:00.000 | 2020-04-15 08:20:00.000 |       1 |
| +I | 2020-04-15 08:11:00.000 | 3.00 |   B |  supplier2 | 2020-04-15 08:10:00.000 | 2020-04-15 08:20:00.000 |       2 |

对两个开窗表进行join

Window JOIN | Apache Flink

Flink SQL> desc LeftTable;
+----------+------------------------+------+-----+--------+----------------------------------+
|     name |                   type | null | key | extras |                        watermark |
+----------+------------------------+------+-----+--------+----------------------------------+
| row_time | TIMESTAMP(3) *ROWTIME* | true |     |        | `row_time` - INTERVAL '1' SECOND |
|      num |                    INT | true |     |        |                                  |
|       id |                 STRING | true |     |        |                                  |
+----------+------------------------+------+-----+--------+----------------------------------+

Flink SQL> SELECT * FROM LeftTable;
+------------------+-----+----+
|         row_time | num | id |
+------------------+-----+----+
| 2020-04-15 12:02 |   1 | L1 |
| 2020-04-15 12:06 |   2 | L2 |
| 2020-04-15 12:03 |   3 | L3 |
+------------------+-----+----+

Flink SQL> desc RightTable;
+----------+------------------------+------+-----+--------+----------------------------------+
|     name |                   type | null | key | extras |                        watermark |
+----------+------------------------+------+-----+--------+----------------------------------+
| row_time | TIMESTAMP(3) *ROWTIME* | true |     |        | `row_time` - INTERVAL '1' SECOND |
|      num |                    INT | true |     |        |                                  |
|       id |                 STRING | true |     |        |                                  |
+----------+------------------------+------+-----+--------+----------------------------------+

Flink SQL> SELECT * FROM RightTable;
+------------------+-----+----+
|         row_time | num | id |
+------------------+-----+----+
| 2020-04-15 12:01 |   2 | R2 |
| 2020-04-15 12:04 |   3 | R3 |
| 2020-04-15 12:05 |   4 | R4 |
+------------------+-----+----+

Flink SQL> 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;
+-------+------+-------+------+------------------+------------------+
| L_Num | L_Id | R_Num | R_Id |     window_start |       window_end |
+-------+------+-------+------+------------------+------------------+
|     1 |   L1 |  null | null | 2020-04-15 12:00 | 2020-04-15 12:05 |
|  null | null |     2 |   R2 | 2020-04-15 12:00 | 2020-04-15 12:05 |
|     3 |   L3 |     3 |   R3 | 2020-04-15 12:00 | 2020-04-15 12:05 |
|     2 |   L2 |  null | null | 2020-04-15 12:05 | 2020-04-15 12:10 |
|  null | null |     4 |   R4 | 2020-04-15 12:05 | 2020-04-15 12:10 |
+-------+------+-------+------+------------------+------------------+

flink(10) flink sql 窗口函数 及其他常见函数 窗口 阅读详情

相关推荐

【Flink】各种窗口的使用(处理时间窗口、事件时间窗口、窗口聚合窗口)

streaming流式计算是一种被设计用于处理无限数据集的数据处理引擎,而无限数据集是指一种不断增长的本质上无限的数据集,而window是一种切割无限数据为有限块进行处理的手段。Window是无限数据流处理的核心,Window将一个无限的stream拆分成有限大小的”buckets”桶,我们可以在这些桶上做计算操作。ProcessFunction:不分流直接聚合,不可以使用定时器和状态变量,因为其没有经过keyBy,定时器和状态变量都是针对key的,只有processElement。

weixin_43923463的博客 4481

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

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

m0_46507516的博客 4204

7. Flink SQL

它可以关联到时态表中的历史版本数据,主要的应用场景是在维度数据变化比较频繁比如在分钟级别会变化,而且数据也有较严重的延迟现象,这种情况就适合用时态Join,创建维度表为时态表,然后主表join上这个时态表,此时就算主流数据延迟比较多,也同样能关联到已经被修改过的维度数据,案例如下。FlinkSql的窗口聚合中,主要有这么几类窗口,滚动窗口,滑动窗口,累计窗口,其中滚动窗口和滑动窗口的定义和dataStream中的一致,下面介绍下累计窗口,以及这些窗口的关键步骤。的方式设置聚合的窗口。

qq_21451945的博客 967

Flink TableAPI和SQL(十三)开窗(Over)聚合

文章目录PARTITION BY(可选)ORDER BY开窗范围范围间隔行间隔 在标准 SQL 中还有另外一类比较特殊的聚合方式,可以针对每一行计算一个聚合值。比如说,我们可以以每一行数据为基准,计算它之前 1 小时内所有数据的平均值;也可以计算它之前 10 个数的平均值。就好像是在每一行上打开了一扇窗户、收集数据进行统计一样,这就是所谓的“开窗函数”。开窗函数的聚合与之前两种聚合有本质的不同:分组聚合、窗口 TVF聚合都是“多对一”的关系,将数据分组之后每组只会得到一个聚合结果;而开窗函数是对每行都要做一

weixin_45417821的博客 2536

[实战-12] flinkSql 时间属性

在阅读下面知识之前,读者需要先看Flinksql设置时区。

笔生花的博客 1762

flink实战--flinksql 窗口TVF

表值函数(, TVF),就是指返回值是⼀张表的函数,其实z在Oracle、SQL Server等数据库中屡⻅不鲜。⽽在Flink的上⼀个稳定版本1.13中,社区通过FLIP-145提出了窗⼝表值函数(window TVF)的实现,⽤于替代旧版的窗⼝分组(group window)语法。本文将从 Window TVF 语法、近实时累计计算场景、 Window 性能优化、多维数据分析,来介绍TVF使用。对比发现:TVF 语法更加灵活。............

阿华田的博客 1916

FlinkSql开窗实例:消费kafka写入文本

以前写Flink从kafka入hdfs因为业务需求和老版本缘故都是自定义BucketSink入动态目录中,对于简单的需求可以直接用Flink SQL API进行输出。Flink版本1.13.1。

长臂人猿的博客 2252

FlinkSQL水位和开窗

import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.Table; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; /**.

someInNeed的博客 677

FlinkSQL 窗口聚合

id=1, 1970-01-01T00:00:03Z, 1, 11]+I[张三, ./home, 1970-01-01T00:00:05Z, 2, 6]+I[张三, ./home, 1970-01-01T00:00:06Z, 3, 6]+I[李四, ./cart, 1970-01-01T00:00:08Z, 2, 6]# 10s内,王五2次,url最大11+I[王五, ./prod?在进行窗口计算时,分组窗口是将窗口本身当作一个字段对数据进行分组的,可以对组内的数据进行聚合。

全网同名,欢迎关注。 3092

C#与发那科机器人通信实战:从SDK配置到机械臂控制

本文详细介绍了如何使用C#与发那科机器人进行通信,从SDK配置到机械臂控制的完整实战流程。内容包括环境准备、通信连接建立、机械臂运动控制、异常处理与状态监控,以及高级功能实战,帮助开发者快速掌握工业机器人编程技术。

weixin_42524276的博客 459

别再手动巡检了!用Zabbix 5.0 + SNMPv2自动监控华为S系列交换机(附完整命令集)

本文详细介绍了如何利用Zabbix 5.0与SNMPv2实现华为S系列交换机的自动化监控,告别低效的手动巡检。通过配置SNMPv2c安全基线、核心功能启用及Zabbix Server端深度配置,构建7×24小时监控体系,实时预警接口状态、流量波动等关键指标,大幅提升运维效率与故障响应速度。

weixin_30940783的博客 630

FlinkSql窗口概念,及水印使用

双流join的情况下,watermark的获取方式为: 1.分别计算俩条流的watermark 2.然后比对俩条流的watermark选取小的 ->CombineWatermark = min(watermark1,watermark2) 双流join关于的Interval Join的实现 Interval Join则没有window的概念,直接用时间戳作为关联的条件,更具表达力。由于流消息的无限性以及消息乱序的影响,本应关联上的消息可能进入处理系统的时间有较大差异,一条流中的消息,可能需要和另一条流

斧王,不能再斩杀了吗的博客 1831

QMT vs Ptrade:量化交易新手如何根据需求选择券商系统(附实战案例)

本文对比了QMT和Ptrade两大券商量化交易系统的核心差异,帮助量化交易新手根据需求选择合适的平台。QMT适合技术面策略开发,执行效率高;Ptrade则提供全面的财务数据和复杂策略支持。通过实战案例,展示了如何结合两平台优势实现高效量化交易。

weixin_42683394的博客 528

FlinkSql中的聚合查询

在 SQL 中,一个很常见的功能就是对某一列的多条数据做一个合并统计,得到一个或多个结果值;比如求和、最大最小值、平均值等等,这种操作叫作聚合(Aggregation)查询。Flink 中的 SQL 是流处理与标准 SQL 结合的产物,所以聚合查询也可以分成两种:流处理中特有的聚合(主要指窗口聚合),以及 SQL 原生的聚合查询方式(分组聚合和over聚合)。

qq_42456324的博客 2950

Halcon 3D视觉实战:5步将线激光高度数据转为可分析的深度图与点云

本文详细介绍了如何利用Halcon平台将线激光高度数据转换为深度图与点云的5步实战方法。通过具体代码示例和工业检测案例(如锂电池胶水测量),帮助工程师高效处理3D视觉数据,实现从原始数据到三维可视化的完整技术链路。

weixin_29039773的博客 361

手把手教你在Keil/IAR中移植SEGGER_RTT组件(避坑指南+性能对比)

本文详细介绍了在Keil/IAR开发环境中移植SEGGER RTT调试组件的完整流程与优化技巧。通过对比传统串口调试,SEGGER RTT凭借零硬件占用、高速传输和双向交互等优势,显著提升嵌入式开发效率。文章包含配置步骤、性能调优方案及常见问题解决方案,是嵌入式开发者必备的实用指南。

y7z8a的博客 245

FlinkSQL中的窗口

需求:有一张test表,表的字段为:A, B, C, amount, 其中A, B, C为维度字段,求以三个维度任意组合,统计sum(amount)

qq_44273739的博客 1096

手把手教你用C#实现TwinCAT 3 ADS通讯(附完整代码示例)

本文详细解析了如何使用C#实现TwinCAT 3 ADS通讯,包括协议核心价值、开发环境配置、变量通信实践及高级应用场景。通过完整代码示例和性能优化技巧,帮助开发者高效实现工业自动化系统中的实时数据交换,特别适合倍福(Beckhoff)平台用户。

weixin_29230901的博客 118

FlinkSQL - 级联窗口计算并Sink2Hbase

FlinkSQL 级联窗口计算并Sink2Hbase

Rango_lhl的博客 892

MT5策略如何设置回测结果才能最接近实盘

摘要:在MT5回测中,选择"每笔分笔报价"模式最接近实盘交易,因其使用真实Tick数据模拟价格波动、点差和滑点。关键设置包括:下载高质量历史数据、合理设定点差和滑点、使用正常回测速度。该模式能准确测试挂单、止盈止损等策略,虽然速度较慢但结果最可靠,避免其他模式造成的失真,是评估交易策略表现的最佳选择。(149字)

weixin_38915451的博客 1879

Midscene.js(3):手把手教你用 YAML 脚本实现 AI 驱动的 Web UI 自动化「喂饭教程」

Midscene.js是一款开源的AI驱动UI自动化工具,通过自然语言描述即可控制浏览器或Android设备执行操作。它支持YAML脚本编写测试用例,降低了自动化测试门槛。

blues_C的博客 3245

【实时数仓】DWS层之地区主题表(FlinkSQL)、关键词主题表(FlinkSQL)

SQL 查询的分组窗口是通过 `GROUP BY` 子句定义的。类似于使用常规 `GROUP BY` 语句的查询,窗口分组语句的 `GROUP BY` 子句中带有一个窗口函数为每个分组计算出一个结果。以下是批处理表和流处理表支持的分组窗口函数:可以使用以下辅助函数选择组窗口的开始和结束时间戳以及时间属性:注意:* 辅助函数必须使用与 `GROUP BY` 子句中的分组窗口函数完全相同的参数来调用。注意:因为是事件时间,所以第一次运行rt_dblog的时候,不会触发watermark,第二次再运行rt_dbl

weixin_43923463的博客 1570

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

一篇文章带你深入理解FlinkSQL中的窗口

前言          时间语义,要配合窗口操作才能发挥作用。最主要的用途,当然就是开窗口、根据时间段做计算了。下面我们就来看看 Table API 和 SQL 中,怎么利用时间字段做窗口操作。在 Table API 和 SQL 中,主要有两种窗口:Group Windows 和 Over Windows(时间语义的文章推荐) ...

大数据记录 4889

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Flink系列Table API和SQL之:开窗Over聚合

Flink系列Table API和SQL之:开窗Over聚合

zhengzaifeidelushang的博客 1756

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

FlinkSQL 之乱序问题

- Flink 框架在可以保证 operator 和 operator hash 时, 一定是可以保证具有相同 hash 值的数据的在两个 operator 之间传输顺序性 - Flink 框架无法保证数据连续多个 operator hash 的顺序, 当 operator 和 operator 之间的 hash 条件发生变化, 则有可能出现数据的顺序性问题。 - 当 hash 条件由少变多时, 不会产生顺序问题, 当 hash 条件由多变少时, 则可能会产生顺序问题。

jiangjiangaa666的博客 1564

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的博客 4842
上一篇: Flink 双流Join
下一篇: Flink dataStream,如何开窗,如何进行窗口内计算
JNWsong
博客等级 码龄9年 287粉丝 204原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值