当前位置: 首页 > news >正文

Flink系列之:窗口Top-N

Flink系列之:窗口Top-N

  • 一、窗口Top-N
  • 二、示例:在窗口聚合后进行窗口 Top-N
  • 三、在窗口表值函数后进行窗口 Top-N
  • 四、限制

一、窗口Top-N

  • 适用于流、批一体
  • 窗口 Top-N 是特殊的 Top-N,它返回每个分区键的每个窗口的N个最小或最大值。
  • 与普通Top-N不同,窗口Top-N只在窗口最后返回汇总的Top-N数据,不会产生中间结果。窗口 Top-N 会在窗口结束后清除不需要的中间状态。 因此,窗口 Top-N 适用于用户不需要每条数据都更新Top-N结果的场景,相对普通Top-N来说性能更好。通常,窗口 Top-N 直接用于 窗口表值函数上。 另外,窗口 Top-N 可以用于基于 窗口表值函数 的操作之上,比如 窗口聚合,窗口 Top-N 和 窗口关联。
  • 窗口 Top-N 的语法和普通的 Top-N 相同。除此之外,窗口 Top-N 需要 PARTITION BY 子句包含 窗口表值函数 或 窗口聚合 产生的 window_start 和 window_end。 否则优化器无法翻译。

下面展示了窗口 Top-N 的语法:

SELECT [column_list]
FROM (SELECT [column_list],ROW_NUMBER() OVER (PARTITION BY window_start, window_end [, col_key1...]ORDER BY col1 [asc|desc][, col2 [asc|desc]...]) AS rownumFROM table_name) -- relation applied windowing TVF
WHERE rownum <= N [AND conditions]

二、示例:在窗口聚合后进行窗口 Top-N

下面的示例展示了在10分钟的滚动窗口上计算销售额位列前三的供应商。

-- tables must have time attribute, e.g. `bidtime` in this table
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 |     |        |                                 |
| supplier_id |                 STRING | true |     |        |                                 |
+-------------+------------------------+------+-----+--------+---------------------------------+Flink SQL> SELECT * FROM Bid;
+------------------+-------+------+-------------+
|          bidtime | price | item | supplier_id |
+------------------+-------+------+-------------+
| 2020-04-15 08:05 |  4.00 |    A |   supplier1 |
| 2020-04-15 08:06 |  4.00 |    C |   supplier2 |
| 2020-04-15 08:07 |  2.00 |    G |   supplier1 |
| 2020-04-15 08:08 |  2.00 |    B |   supplier3 |
| 2020-04-15 08:09 |  5.00 |    D |   supplier4 |
| 2020-04-15 08:11 |  2.00 |    B |   supplier3 |
| 2020-04-15 08:13 |  1.00 |    E |   supplier1 |
| 2020-04-15 08:15 |  3.00 |    H |   supplier2 |
| 2020-04-15 08:17 |  6.00 |    F |   supplier5 |
+------------------+-------+------+-------------+Flink SQL> SELECT *FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY price DESC) as rownumFROM (SELECT window_start, window_end, supplier_id, SUM(price) as price, COUNT(*) as cntFROM TABLE(TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES))GROUP BY window_start, window_end, supplier_id)) WHERE rownum <= 3;
+------------------+------------------+-------------+-------+-----+--------+
|     window_start |       window_end | supplier_id | price | cnt | rownum |
+------------------+------------------+-------------+-------+-----+--------+
| 2020-04-15 08:00 | 2020-04-15 08:10 |   supplier1 |  6.00 |   2 |      1 |
| 2020-04-15 08:00 | 2020-04-15 08:10 |   supplier4 |  5.00 |   1 |      2 |
| 2020-04-15 08:00 | 2020-04-15 08:10 |   supplier2 |  4.00 |   1 |      3 |
| 2020-04-15 08:10 | 2020-04-15 08:20 |   supplier5 |  6.00 |   1 |      1 |
| 2020-04-15 08:10 | 2020-04-15 08:20 |   supplier2 |  3.00 |   1 |      2 |
| 2020-04-15 08:10 | 2020-04-15 08:20 |   supplier3 |  2.00 |   1 |      3 |
+------------------+------------------+-------------+-------+-----+--------+

注意: 为了更好地理解窗口行为,这里把 timestamp 值后面的0去掉了。例如:在 Flink SQL Client 中,如果类型是 TIMESTAMP(3) ,2020-04-15 08:05 应该显示成 2020-04-15 08:05:00.000 。

这条Flink SQL查询的目标是在表Bid中根据时间窗口对数据进行分组,并找出每个窗口内价格最高的三个供应商。

  • 首先,在FROM子句中,使用TUMBLE函数对Bid表进行分区,每个分区的时间窗口大小为10分钟,并指定bidtime作为分区依据。然后,将其结果作为内部查询的输入表。
  • 在内部查询中,使用GROUP BY子句将数据按窗口的开始时间(window_start)、结束时间(window_end)和供应商ID(supplier_id)进行分组。并计算每个分组的价格总和(SUM(price))和行数(COUNT(*))。同时,使用ROW_NUMBER()函数在每个窗口分组内按价格降序排列,并为每行分配一个行号(rownum)。
  • 最后,在外部查询中,筛选出行号(rownum)小于等于3的记录,并返回窗口的开始时间、结束时间、供应商ID、价格总和、行数和行号。
  • 最终的查询结果将包括每个窗口内价格最高的三个供应商的信息。

三、在窗口表值函数后进行窗口 Top-N

下面的示例展示了在10分钟的滚动窗口上计算价格位列前三的数据。

Flink SQL> SELECT *FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY price DESC) as rownumFROM TABLE(TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES))) WHERE rownum <= 3;
+------------------+-------+------+-------------+------------------+------------------+--------+
|          bidtime | price | item | supplier_id |     window_start |       window_end | rownum |
+------------------+-------+------+-------------+------------------+------------------+--------+
| 2020-04-15 08:05 |  4.00 |    A |   supplier1 | 2020-04-15 08:00 | 2020-04-15 08:10 |      2 |
| 2020-04-15 08:06 |  4.00 |    C |   supplier2 | 2020-04-15 08:00 | 2020-04-15 08:10 |      3 |
| 2020-04-15 08:09 |  5.00 |    D |   supplier4 | 2020-04-15 08:00 | 2020-04-15 08:10 |      1 |
| 2020-04-15 08:11 |  2.00 |    B |   supplier3 | 2020-04-15 08:10 | 2020-04-15 08:20 |      3 |
| 2020-04-15 08:15 |  3.00 |    H |   supplier2 | 2020-04-15 08:10 | 2020-04-15 08:20 |      2 |
| 2020-04-15 08:17 |  6.00 |    F |   supplier5 | 2020-04-15 08:10 | 2020-04-15 08:20 |      1 |
+------------------+-------+------+-------------+------------------+------------------+--------+

注意: 为了更好地理解窗口行为,这里把 timestamp 值后面的0去掉了。例如:在 Flink SQL Client 中,如果类型是 TIMESTAMP(3) ,2020-04-15 08:05 应该显示成 2020-04-15 08:05:00.000 。

这个Flink SQL语句的目标是从表Bid中选择特定的列,并为每个时间窗口内的数据分配一个行号(rownum)。行号的分配是基于每个窗口内数据的价格进行降序排列。

  • 首先,在内部查询中,使用TUMBLE函数将Bid表按照bidtime进行分区,每个分区代表一个时间窗口,窗口大小为10分钟。然后将分区结果作为输入表。
  • 接下来,在内部查询中,使用ROW_NUMBER()函数为每个窗口分组内的数据分配行号。PARTITION BY子句指定按窗口开始时间(window_start)和结束时间(window_end)进行分组,ORDER BY子句指定按价格(price)降序排列。这样,每个时间窗口内的数据就会被分配一个行号。
  • 最后,在外部查询中,筛选出行号(rownum)小于等于3的记录,这意味着只保留每个时间窗口内前三个价格最高的数据。
  • 最终的查询结果将包括原始表中的所有列,以及每个时间窗口的开始时间、结束时间和行号。这样就可以查看每个窗口内价格最高的前三个数据,同时保留其他列的信息。

四、限制

  • 目前,Flink只支持在滚动,滑动和累计 窗口表值函数后进行窗口 Top-N。基于会话窗口的Top-N将在将来版本中支持。

相关文章:

Flink系列之:窗口Top-N

Flink系列之&#xff1a;窗口Top-N 一、窗口Top-N二、示例&#xff1a;在窗口聚合后进行窗口 Top-N三、在窗口表值函数后进行窗口 Top-N四、限制 一、窗口Top-N 适用于流、批一体窗口 Top-N 是特殊的 Top-N&#xff0c;它返回每个分区键的每个窗口的N个最小或最大值。与普通To…...

【k8s】--insecure-registry详解 ( 访问仓库、https、http)

文章目录 一、--insecure-registry是什么二、如何使用--insecure-registry三、--insecure-registry的安全风险四、--insecure-registry的替代方案五、总结参考 一、–insecure-registry是什么 --insecure-registry是docker中用来设置与docker registry通信的安全限制的一个参数…...

ElementUI,修改el-cascader的默认样式

Element UI 中的下拉弹窗是通过在整个body标签末尾动态添加div实现的&#xff0c;所以修改样式时&#xff0c;必须要定义全局样式才能实现样式覆盖&#xff0c;那怎样才能避免全局的样式污染呢&#xff1f; 解决办法&#xff1a;通过给组件添加自定义的 popper-class 属性来避…...

外卖系统海外版:代码与美食的完美交融

在数字化时代&#xff0c;外卖系统海外版正引领着全球美食点餐的新潮流。不仅为用户提供了便捷的用餐服务&#xff0c;更通过技术创新为美食与代码之间搭建了一座桥梁。本文将探讨其中的一些技术应用&#xff0c;并呈现与美食完美交融的全新体验。 多语言支持代码示例 def m…...

Java代码解析:初学者的编程入门指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 Java作为一门强大而广泛应用的编程语言&#x…...

数据结构--图

树具有灵活性&#xff0c;并且存在许多不同的树的应用&#xff0c;但是就树本身而言有一定的局限性&#xff0c;树只能表示层次关系&#xff0c;比如父子关系。而其他的比如兄弟关系只能够间接表示。 推广--- 图 图形结构中&#xff0c;数据元素之间的关系是任意的。 一、图…...

AXure的情景交互

目录 导语&#xff1a; 1.erp多样性登录界面 2.主页跳转 3.省级联动​编辑 4. 下拉加载 导语&#xff1a; Axure是一种流行的原型设计工具&#xff0c;可以用来创建网站和应用程序的交互原型。通过Axure&#xff0c;设计师可以创建情景交互&#xff0c;以展示用户与系统的交…...

数据库操作习题12.12

考虑如下的人员数据&#xff0c;其中加下划线的是主码&#xff0c;数据库模式由四个关系组成: employee (empname, street, city) works (empname, compname, salary) company(id, compname, city) managers (empname, mgrname) 其中 关系 employee 给出人员的基本信息,包括人员…...

Redis之INCR命令,通常用于统计网站访问量,文章访问量,分布式锁

前言 Redis的INCR命令用于将键的值增加1。如果键不存在&#xff0c;则会先将键的值设置为0&#xff0c;然后再执行INCR操作。INCR命令的作用是对计数器进行自增操作&#xff0c;可以用于实现多种场景&#xff0c;比如统计网站访问量、文章访问量、分布式锁等。 一、Redis键之…...

window运行celery报错

报错信息 Traceback (most recent call last): File "c:\program files\python36\lib\site-packages\billiard\pool.py", line 359, in workloop result (True, prepare_result(fun(*args, **kwargs))) File "c:\program files\python36\lib\site-packages\ce…...

玩转Docker(五):网络

文章目录 〇、关于linux系统网络一、none网络二、host网络三、bridge网络一个问题&#xff1a;为什么在主机上仍可以通过localhost:port访问到容器中的服务&#xff1f; 四、user-defined网络 Docker安装时会自动在host上创建三个网络&#xff0c;我们可用docker network ls命令…...

选择合适教育管理软件:必须考虑的10个关键问题

随着教育行业的迅速数字化&#xff0c;学校要能够提供最新的管理和教育方法。大家逐渐意识到技术让运营变得更容易、更有效率。 不过首先我们需要找到一个能满足需求的应用程序。面对众多的选择&#xff0c;你该如何选择一个合适的平台呢&#xff1f;当然&#xff0c;没有人想…...

前端不同架构的分层设计

1. 架构设计分层: (1). 系统架构: ①. 应用场景:a. 应用在整个系统内,如与后台服务如何通信,与第三方系统如何集成.②. 前提条件:a. 了解前端系统与其它系统间的关系,包括业务关系和协作机制.b. 了解后端系统,需要规定与后台数据传递的机制,包括:(1). api设计规范(2). 访问授…...

android系统镜像文件

boot.img&#xff1a;这是包含内核和设备树&#xff08;Device Tree&#xff09;的镜像文件。它被引导加载程序&#xff08;bootloader&#xff09;加载以启动系统&#xff0c;并负责将控制权转交给内核。 dtbo.img&#xff1a;这是设备树增量编译&#xff08;Device Tree Ove…...

相位的重要性

在过去的几年中&#xff0c;相干信号和图像处理尖端技术的开发和应用有了显著的增长。相干处理的特点是使用一个称为相位的单一量[1]。相比之下&#xff0c;非相干处理只利用信号幅度或强度。需要进行相干处理的例子包括合成孔径雷达&#xff08;SAR&#xff09;、合成孔径声纳…...

(三十三)补充Python经典面试题(吸收高级编程特性)

第一题&#xff1a; def func(a, b[]): pass一、上题讲解&#xff1a; 这个函数定义有一个默认参数b&#xff0c;它的默认值是一个空列表[]。这道面试题涉及到Python中函数参数默认值的一些重要概念和陷阱。 首先&#xff0c;当你调用这个函数时&#xff0c;如果不传递参数b…...

SQL进阶理论篇(四):索引的结构原理(B树与B+树)

文章目录 简介如何评价索引的数据结构设计好坏二叉树的局限性什么是B树什么是B树总结参考文献 简介 我们在上一节中说过&#xff0c;索引其实是一种数据结构&#xff0c;那它到底是一种什么样的数据结构呢&#xff1f;本节将简单介绍一下几个问题&#xff1a; 什么样的数据结…...

springMVC-模型数据的处理

一、数据放入到request域当中 1、把获取的数据放入request域中&#xff0c; 方便在跳转页面去显示 <a>添加主人信息</a> <form action"vote/vote04" method"post" >主人id&#xff1a;<input type"text" name"id&q…...

计算机组成原理-微指令的设计与微程序控制单元的设计

文章目录 微指令的设计微指令的格式微指令的编码方式水平型微指令的操作控制部分的编码方式直接编码字段直接编码例题字段间接编码方式 微指令的地址形成方式例题小结 微程序控制单元的设计微程序设计分类硬布线与微程序的比较 微指令的设计 微指令的格式 水平型微指令的操作…...

PyTorch机器学习与深度学习

近年来&#xff0c;随着AlphaGo、无人驾驶汽车、医学影像智慧辅助诊疗、ImageNet竞赛等热点事件的发生&#xff0c;人工智能迎来了新一轮的发展浪潮。尤其是深度学习技术&#xff0c;在许多行业都取得了颠覆性的成果。另外&#xff0c;近年来&#xff0c;Pytorch深度学习框架受…...

SDXL 1.0插件开发:Photoshop脚本自动化集成

SDXL 1.0插件开发&#xff1a;Photoshop脚本自动化集成 1. 为什么需要Photoshop与SDXL 1.0的深度协作 设计师每天面对的不是单一工具&#xff0c;而是一整套工作流。当AI生成图像成为创意起点&#xff0c;问题就来了&#xff1a;生成的图片如何快速进入专业设计环节&#xff…...

构建专业级Java量化交易系统的5个实战步骤

构建专业级Java量化交易系统的5个实战步骤 【免费下载链接】ta4j A Java library for technical analysis. 项目地址: https://gitcode.com/gh_mirrors/ta/ta4j 你是否曾想用Java构建自己的量化交易系统&#xff0c;但被复杂的技术指标和回测框架吓退&#xff1f;今天&a…...

如何通过Snap Hutao实现原神游戏决策的智能化?

如何通过Snap Hutao实现原神游戏决策的智能化&#xff1f; 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 &#x1f9f0; / Multifunctional Open-Source Genshin Impact Toolkit &#x1f9f0; 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Hutao …...

NHSE完全指南:3步掌握动物森友会存档编辑器的核心功能

NHSE完全指南&#xff1a;3步掌握动物森友会存档编辑器的核心功能 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE NHSE&#xff08;Animal Crossing: New Horizons Save Editor&#xff09;是一款…...

bilibili-downloader开源工具:突破B站4K视频下载限制的全攻略

bilibili-downloader开源工具&#xff1a;突破B站4K视频下载限制的全攻略 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 在数字内容消…...

如何获取网易云音乐永久链接:终极免费解决方案指南

如何获取网易云音乐永久链接&#xff1a;终极免费解决方案指南 【免费下载链接】netease-cloud-music-api 网易云音乐直链解析 API 项目地址: https://gitcode.com/gh_mirrors/ne/netease-cloud-music-api 你是否曾经遇到过这样的烦恼&#xff1a;好不容易找到一首喜欢的…...

数字孪生通信层开发:C#实现OPC UA到Unity3D的实时数据映射(2026年工业级实战指南)

引言&#xff1a;通信层不是“锦上添花”&#xff0c;而是“数字孪生的血脉” 在2026年的工业数字孪生战场上&#xff0c;OPC UA到Unity3D的数据映射延迟是决定孪生体“活”与“死”的关键。IDC 2026年工业物联网报告显示&#xff1a;76%的数字孪生项目因通信层延迟>100ms失…...

s2-proGPU利用率提升方案:批处理合成与异步请求性能压测报告

s2-pro GPU利用率提升方案&#xff1a;批处理合成与异步请求性能压测报告 1. 项目背景与挑战 s2-pro作为Fish Audio开源的专业级语音合成模型镜像&#xff0c;在实际应用中面临GPU利用率不足的问题。通过初步监测发现&#xff1a; 单次请求GPU利用率峰值仅达到35-40%请求间隔…...

uView Input前后槽实战:5分钟搞定搜索框+验证码组合

uView Input前后槽实战&#xff1a;5分钟搞定搜索框验证码组合 在移动端开发中&#xff0c;输入框(Input)是最基础也是最常用的UI组件之一。无论是用户登录、搜索功能还是表单填写&#xff0c;都离不开它。但你是否遇到过这样的困扰&#xff1a;想要在输入框左侧添加一个搜索图…...

告别OpenAI API费用:手把手教你用本地BGE模型+FAISS搭建LangChain私有知识库

零成本构建企业级知识库&#xff1a;基于BGE与FAISS的私有化LangChain解决方案 在AI应用开发领域&#xff0c;数据隐私和成本控制正成为越来越多开发者的核心考量。当OpenAI等商业API按调用次数收费时&#xff0c;频繁的查询请求可能让个人开发者和小型团队不堪重负。更关键的是…...