OVER窗口

简介:

OVER窗口(OVER Window)是传统数据库的标准开窗,OVER Window不同于Group By Window,OVER Window中每一个元素都对应一个窗口。窗口元素是与当前元素相邻的元素集合, 流上元素会在多个窗口中。在Flink SQL Window的实现中,每个触发计算的元素所确定的行,都是该元素所在窗口的最后一行。

生命周期

在应用OVER Window的Stream中,每一个元素都对应一个OVER Window。每一个元素都触发一次数据计算。在Flink的底层实现中,OVER Window的数据进行全局统一管理(数据只存储一份),逻辑上为每一个元素维护一个OVER Window,为每一个元素进行窗口计算,完成计算后会清除过期的数据。

SQL


  
  
  1. SELECT
  2. agg1(col1) OVER (definition1) AS colName,
  3. ...
  4. aggN(colN) OVER (definition1) AS colNameN
  5. FROM Tab1

注意

  • agg1到aggN所对应的OVER definition1必须相同。
  • AS 的别名可供外层SQL进行查询。

类型

Flink SQL中对OVER Window的定义遵循标准SQL的定义语法,传统OVER Window没有对其进行更细粒度的窗口类型命名划分。本节为了让您更清楚细致了解OVER Window的语义,将OVER Window按照计算行的定义方式划分为如下两类。

  • ROWS OVER Window - 每一行元素都视为新的计算行,即每一行都是一个新的窗口。
  • RANGE OVER Window - 具有相同时间值的所有元素行视为同一计算行,即具有相同时间值的所有行都是同一个窗口。

属性

正交属性 proctime eventtime
rows
range
  • rows - 按照实际元素的行进行确定窗口。
  • range - 按照实际的元素值(时间戳值)进行确定窗口。

语义

Rows OVER Window

窗口数据

ROWS OVER Window的每个元素都确定一个窗口。ROWS OVER Window也有Unbounded和Bounded的两种情况。

Unbounded ROWS OVER Window 数据如下图所示。

UnBounded ROWS OVER Window

注意: 上图所示窗口user1的w7和w8,user2的窗口w3和w4,虽然元素都是同一时刻到达,但是它们仍然是在不同的窗口,这一点有别于RANGE OVER Window。

Bounded ROWS OVER Window 数据以3个元素(2 PRECEDING)的窗口为例,如下图所示。

Bounded ROWS OVER Window

注意: 上图所示窗口user1的w5和w6,user2的窗口w2和w3,虽然有元素都是同一时刻到达,但是它们仍然是在不同的窗口,这一点有别于RANGE OVER Window。

窗口语法


  
  
  1. SELECT
  2. agg1(col1) OVER(
  3. [PARTITION BY (value_expression1,..., value_expressionN)]
  4. ORDER BY timeCol
  5. ROWS
  6. BETWEEN (UNBOUNDED | rowCount) PRECEDING AND CURRENT ROW) AS colName, ...
  7. FROM Tab1
  • value_expression - 分区值表达式。
  • timeCol - 用于元素排序的时间字段。
  • rowCount - 是定义根据当前行开始向前追溯几行元素。

案例

以Bounded ROWS OVER Window场景示例,假设有一张商品上架表,包含有商品ID、商品类型、商品上架时间、商品价格数据。假设求在当前商品上架之前同类的3个商品中的最高价格。

测试数据

商品ID 商品类型 上架时间 销售价格
ITEM001 Electronic 2017-11-11 10:01:00 20
ITEM002 Electronic 2017-11-11 10:02:00 50
ITEM003 Electronic 2017-11-11 10:03:00 30
ITEM004 Electronic 2017-11-11 10:03:00 60
ITEM005 Electronic 2017-11-11 10:05:00 40
ITEM006 Electronic 2017-11-11 10:06:00 20
ITEM007 Electronic 2017-11-11 10:07:00 70
ITEM008 Clothes 2017-11-11 10:08:00 20

测试代码


  
  
  1. CREATE TABLE tmall_item(
  2. itemID VARCHAR,
  3. itemType VARCHAR,
  4. onSellTime TIMESTAMP,
  5. price DOUBLE
  6. WATERMARK onSellTime FOR onSellTime as withOffset(onSellTime, 0)
  7. )
  8. WITH (
  9. type = 'sls',
  10. ...
  11. ) ;
  12. SELECT
  13. itemID,
  14. itemType,
  15. onSellTime,
  16. price,
  17. MAX(price) OVER (
  18. PARTITION BY itemType
  19. ORDER BY onSellTime
  20. ROWS BETWEEN 2 preceding AND CURRENT ROW) AS maxPrice
  21. FROM tmall_item

测试结果

itemID itemType onSellTime price maxPrice
ITEM001 Electronic 2017-11-11 10:01:00 20 20
ITEM002 Electronic 2017-11-11 10:02:00 50 50
ITEM003 Electronic 2017-11-11 10:03:00 30 50
ITEM004 Electronic 2017-11-11 10:03:00 60 60
ITEM005 Electronic 2017-11-11 10:05:00 40 60
ITEM006 Electronic 2017-11-11 10:06:00 20 60
ITEM007 Electronic 2017-11-11 10:07:00 70 70
ITEM008 Clothes 2017-11-11 10:08:00 20 20

RANGE OVER Window

窗口数据

RANGE OVER Window所有具有共同元素值(元素时间戳)的元素行确定一个窗口,RANGE OVER Window也有Unbounded和Bounded的两种情况。

Unbounded RANGE OVER Window 数据如下图所示。UnBounded RANGE OVER Window

注意: 上图所示窗口user1的w7, user2的窗口w3 ,两个元素同一时刻到达,他们属于相同的window,这一点有别于ROWS OVER Window。

Bounded RANGE OVER Window 数据,以3秒中数据(INTERVAL ‘2’ SECOND)的窗口为例,如下图所示。

Bounded RANGE OVER Window

注意: 上图所示窗口user1的w6, user2的窗口w3,元素都是同一时刻到达,他们属于相同的window,这一点有别于ROWS OVER Window。

窗口语法


  
  
  1. SELECT
  2. agg1(col1) OVER(
  3. [PARTITION BY (value_expression1,..., value_expressionN)]
  4. ORDER BY timeCol
  5. RANGE
  6. BETWEEN (UNBOUNDED | timeInterval) PRECEDING AND CURRENT ROW) AS colName,
  7. ...
  8. FROM Tab1
  • value_expression - 进行分区的字表达式。
  • timeCol - 用于元素排序的时间字段。
  • timeInterval - 是定义根据当前行开始向前追溯指定时间的元素行。

案例

以Bounded RANGE OVER Window场景示例,假设有一张商品上架表,包含有商品ID、商品类型、商品上架时间、商品价格数据。假设求比当前商品上架时间早2分钟的同类商品中的最高价格。

测试数据

商品ID 商品类型 上架时间 销售价格
ITEM001 Electronic 2017-11-11 10:01:00 20
ITEM002 Electronic 2017-11-11 10:02:00 50
ITEM003 Electronic 2017-11-11 10:03:00 30
ITEM004 Electronic 2017-11-11 10:03:00 60
ITEM005 Electronic 2017-11-11 10:05:00 40
ITEM006 Electronic 2017-11-11 10:06:00 20
ITEM007 Electronic 2017-11-11 10:07:00 70
ITEM008 Clothes 2017-11-11 10:08:00 20

测试代码


  
  
  1. CREATE TABLE tmall_item(
  2. itemID VARCHAR,
  3. itemType VARCHAR,
  4. onSellTime TIMESTAMP,
  5. price DOUBLE
  6. WATERMARK onSellTime FOR onSellTime as withOffset(onSellTime, 0)
  7. )
  8. WITH (
  9. type = 'sls',
  10. ...
  11. ) ;
  12. SELECT
  13. itemID,
  14. itemType,
  15. onSellTime,
  16. price,
  17. MAX(price) OVER (
  18. PARTITION BY itemType
  19. ORDER BY onSellTime
  20. RANGE BETWEEN INTERVAL '2' MINUTE preceding AND CURRENT ROW) AS maxPrice
  21. FROM tmall_item

测试结果

itemID itemType onSellTime price maxPrice
ITEM001 Electronic 2017-11-11 10:01:00 20 20
ITEM002 Electronic 2017-11-11 10:02:00 50 50
ITEM003 Electronic 2017-11-11 10:03:00 30 50
ITEM004 Electronic 2017-11-11 10:03:00 60 60
ITEM005 Electronic 2017-11-11 10:05:00 40 60
ITEM006 Electronic 2017-11-11 10:06:00 20 40
ITEM007 Electronic 2017-11-11 10:07:00 70 70
ITEM008 Clothes 2017-11-11 10:08:00 20 20

本文转自实时计算——OVER窗口

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
Java 测试技术 网络安全
PTS报错问题之压测报错如何解决
PTS(Performance Testing Service)是一项面向网站、应用等提供的压力测试服务,用于模拟不同场景下的用户访问,评估系统的性能表现;在进行PTS压测时,可能会出现一些异常或报错,本合集将PTS压测中频繁出现的问题及其解决办法进行汇编,旨在帮助用户更有效地进行性能测试和问题定位。
|
小程序 JavaScript 前端开发
小程序wx:if 和hidden的区别?
小程序wx:if 和hidden的区别?
|
Java 应用服务中间件 数据安全/隐私保护
面试官:过滤器Filter和拦截器Interceptors有什么区别?
面试官:过滤器Filter和拦截器Interceptors有什么区别?
188 0
HTML 表格3
HTML 表格的表头使用 `<th>` 标签定义,通常以粗体居中显示。
|
安全 网络安全 数据安全/隐私保护
网络安全漏洞与加密技术:保护信息的艺术
【8月更文挑战第31天】在数字时代,网络安全和信息安全的重要性日益凸显。本文将探讨网络安全漏洞、加密技术以及提升安全意识等方面的内容。我们将通过实际代码示例和案例分析,深入了解网络攻击者如何利用安全漏洞进行攻击,以及如何运用加密技术来保护数据安全。同时,我们还将讨论如何提高个人和组织的安全意识,以应对不断变化的网络安全威胁。让我们一起探索这个充满挑战和机遇的领域吧!
|
算法 Oracle 前端开发
|
前端开发 jenkins 应用服务中间件
docker-compose 容器编排
本文主要介绍docker-compose:1.配置文件详解;2.常用操作命令;3.容器编排实践;
docker-compose 容器编排
|
SQL 数据库 HIVE
Python连接Hive数据库
Python连接Hive数据库
|
存储 算法 数据挖掘
服务器数据恢复—raid6硬盘故障导致nas存储无法访问的数据恢复案例
一台nas存储中有一组由十几块硬盘组建的raid6磁盘阵列。 nas存储中的raid6阵列成员盘出现故障离线,磁盘阵列崩溃,nas存储无法正常访问。
服务器数据恢复—raid6硬盘故障导致nas存储无法访问的数据恢复案例
|
XML 数据格式
wps2013打开word是xml
wps2013打开word是xml
154 0