Flink系列之:窗口去重

Flink系列之:窗口去重

  • 一、窗口去重
  • 二、示例
  • 三、限制

一、窗口去重

  • 适用于Streaming
  • 窗口去重是一种特殊的去重,它根据指定的多个列来删除重复的行,保留每个窗口和分区键的第一个或最后一个数据。
  • 对于流式查询,与普通去重不同,窗口去重只在窗口的最后返回结果数据,不会产生中间结果。它会清除不需要的中间状态。 因此,窗口去重查询在用户不需要更新结果时,性能较好。通常,窗口去重直接用于 窗口表值函数 上。另外,它可以用于基于 窗口表值函数 的操作。比如 窗口聚合,窗口TopN 和 窗口关联。
  • 窗口Top-N的语法和普通的Top-N相同。 除此之外,窗口去重需要 PARTITION BY 子句包含表的 window_start 和 window_end 列。 否则优化器无法翻译。
  • Flink 使用 ROW_NUMBER() 移除重复数据,就像 窗口 Top-N 一样。理论上,窗口是一种特殊的窗口 Top-N:N是1并且是根据处理时间或事件时间排序的。

下面展示了窗口去重的语法:

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

参数说明:

  • ROW_NUMBER():为每一行分配一个唯一且连续的序号,从1开始。
  • PARTITION BY window_start, window_end [, col_key1…]: 指定分区字段,需要包含window_start, window_end以及其他分区键。
  • ORDER BY time_attr [asc|desc]: 指定排序列,必须是 时间属性。目前 Flink 支持 处理时间属性 和 事件时间属性。 Order by ASC 表示保留第一行,Order by DESC 表示保留最后一行。
  • WHERE (rownum = 1 | rownum <=1 | rownum < 2): 优化器通过 rownum = 1 | rownum <=1 | rownum < 2 来识别查询能否被翻译成窗口去重。

二、示例

下面的示例展示了在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 |     |        |                                 |
+-------------+------------------------+------+-----+--------+---------------------------------+Flink SQL> SELECT * FROM Bid;
+------------------+-------+------+
|          bidtime | price | item |
+------------------+-------+------+
| 2020-04-15 08:05 |  4.00 | C    |
| 2020-04-15 08:07 |  2.00 | A    |
| 2020-04-15 08:09 |  5.00 | D    |
| 2020-04-15 08:11 |  3.00 | B    |
| 2020-04-15 08:13 |  1.00 | E    |
| 2020-04-15 08:17 |  6.00 | F    |
+------------------+-------+------+Flink SQL> SELECT *FROM (SELECT bidtime, price, item, supplier_id, window_start, window_end, ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY bidtime DESC) AS rownumFROM TABLE(TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES))) WHERE rownum <= 1;
+------------------+-------+------+-------------+------------------+------------------+--------+
|          bidtime | price | item | supplier_id |     window_start |       window_end | rownum |
+------------------+-------+------+-------------+------------------+------------------+--------+
| 2020-04-15 08:09 |  5.00 |    D |   supplier4 | 2020-04-15 08:00 | 2020-04-15 08:10 |      1 |
| 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 只支持在滚动窗口、滑动窗口和累积窗口的窗口表值函数后进行窗口去重。会话窗口的去重将在未来版本中支持。

根据时间属性排序的限制:

  • 目前,窗口去重只支持根据事件时间属性进行排序。根据处理时间排序将在未来版本中支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/230789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试技术分享| Appium用例录制

下载及安装 下载地址&#xff1a; github.com/appium/appi… 下载对应系统的 Appium 版本&#xff0c;安装完成之后&#xff0c;点击 “Start Server”&#xff0c;就启动了 Appium Server。 在启动成功页面点击右上角的放大镜&#xff0c;进入到创建 Session 页面。配置好…

QT作业3

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

Java 程序的命令行解释器

前几天我写了一个简单的词法分析器项目&#xff1a;https://github.com/MarchLiu/oliva/tree/main/lora-data-generator 。 通过词法分析快速生成 lora 训练集。在这个过程中&#xff0c;我需要通过命令行参数给这个 java 程序传递一些参数。 这个工作让我想起了一些不好的回忆…

对Arthas-Trace命令的一次深度剖析,竟发现...

前言&#xff1a;此文仅为笔者学习Arthas源码的一次尝试&#xff0c;不对本文结论负全部责任。 一、背景 笔者在学习arthas这个十分方便的小工具的过程中&#xff0c;发现&#xff1a; 目前据arthas官方解释&#xff1a;因为trace多层是十分消耗资源的&#xff0c;因此trace命…

【期刊出版征稿】2024年艺术、教育和管理国际学术会议(ICAEM2024)

2024年艺术、教育和管理国际学术会议 2024 International Conference on Arts, Education and Management&#xff08;ICAEM2024&#xff09; 2024年艺术、教育和管理国际学术会议&#xff08;ICAEM2024&#xff09;将于2024年2月02-04日在马来西亚-吉隆坡召开。会议主题主要…

跨境助手:提升跨境电商卖家运营效率的利器

在如今全球化的商业环境中&#xff0c;跨境电商成为越来越多卖家追逐的商机。然而&#xff0c;对于新手卖家来说&#xff0c;跨境电商的复杂性和竞争激烈的市场环境可能会成为入坑的风险。如何降低风险、提高运营效率成为卖家们关注的焦点。而跨境助手作为一款专为跨境电商卖家…

Python Pandas 如何增加/插入一列数据(第5讲)

Python Pandas 如何增加/插入一列数据(第5讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

Spring Boot JSON中文文档

本文为官方文档直译版本。原文链接 Spring Boot JSON中文文档 引言Jackson自定义序列化器和反序列化器混入 GsonJSON-B 引言 Spring Boot 提供与三个 JSON 映射库的集成&#xff1a; GsonJacksonJSON-B Jackson 是首选的默认库。 Jackson Spring-boot-starter-json 提供了…

Python实现冰墩墩

目录 一、运行效果 图片效果 二、项目概述 三、开发环境 四、实现步骤及代码 1.导入需要的库。 2.完成剩余部分代码。 五、项目总结 六、源码获取 一、运行效果 图片效果 二、项目概述 这个项目使用了turtle库绘制了一个编程乐学的Logo。Logo中包含了一个笑脸&#xf…

64道Go机制高频题整理(附答案背诵版)

如何解决Golang uint 类型溢出问题&#xff1f; Golang的uint类型溢出问题通常会在大量运算中发生&#xff0c;特别是在涉及到大量循环或者大数运算时。当uint类型的值超过其最大值时&#xff0c;它会发生溢出&#xff0c;然后从该类型的最小值开始循环。为了解决这个问题&…

SpringBoot接入轻量级分布式日志框架GrayLog

1.前言 日志在我们日常开发定位错误&#xff0c;链路错误排查时必不可少&#xff0c;如果我们只有一个服务&#xff0c;我们可以只简单的通过打印的日志文件进行排查定位就可以&#xff0c;但是在分布式服务环境下&#xff0c;多个环境的日志统一收集、展示则成为一个问题。目…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(一)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xff08;一&#xff09; 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

1U、2U、4U和42U服务器,看完秒懂!

晚上好&#xff0c;我的网工朋友。 服务器是一个很广泛的概念&#xff0c;涵盖了各种类型和规格的计算机&#xff0c;用于提供各种网络和数据服务。 而机架服务器是当前数据中心和专业计算环境中&#xff0c;使用最为广泛的服务器类型之一。 机架式服务器的外形看来不像计算…

C++面试宝典第7题:重载自增自减运算符

题目 编程实现一个自定义类CMyInteger,它重载了前缀和后缀形式的++和--操作符。同时,CMyInteger类还有一个Print成员函数,用于输出内部成员变量的值。完成该类后,下面使用CMyInteger的代码应能够编译通过,并得到与内置整形int相同的效果。 int main() {CMyInteger mi1(10…

考研英语一图表作文必背模版句

英语一的作文还是很靠日常积累的&#xff0c;依据潘赟老师的九宫格理论&#xff1a; 2——图画描述5——意义论证8——建议措施 这3个模块式最为核心也是最容易拉开分差的&#xff0c;对于时间有限的同志不建议忙下功夫浪费时间&#xff0c;而对于另外6个模块&#xff0c;还是…

Flink系列之:自定义函数

Flink系列之&#xff1a;自定义函数 一、自定义函数二、概述三、开发指南四、函数类五、求值方法六、类型推导七、自动类型推导八、定制类型推导九、确定性十、内置函数的确定性十一、运行时集成十二、标量函数十三、表值函数十四、聚合函数十五、表值聚合函数 一、自定义函数 …

java IO流-处理流

1、缓冲流 BufferedReader是最好用的文本读入方式其它的不常用&#xff0c;了解一下就行。 带有缓冲区的数据流&#xff0c;大概意思就是会把你要的数据读取完成之后一次发给你。 BufferedInputStream BufferedInputStream in new BufferedInputStream(new FileInputStream(n…

Android 13 - Media框架(22)- ACodec(四)

前面两节我们了解了 ACodec 的创建及配置流程&#xff0c;配置完成后 ACodec 进入了 LoadedState&#xff0c;这一节开始将会了解 ACodec 的启动过程。 调用 ACodec::initiateStart 方法发出的 kWhatStart 消息将有 LoadedState 状态来处理&#xff0c;这个方法会向 OMX 组件发…

【深度学习目标检测】八、基于yolov5的抽烟识别(python,深度学习)

YOLOv5是目标检测领域一种非常优秀的模型&#xff0c;其具有以下几个优势&#xff1a; 1. 高精度&#xff1a;YOLOv5相比于其前身YOLOv4&#xff0c;在目标检测精度上有了显著的提升。YOLOv5使用了一系列的改进&#xff0c;如更深的网络结构、更多的特征层和更高分辨率的输入图…

Git及Linux命令介绍

Git介绍 Git 命令如何工作 首先&#xff0c;必须确定我们的代码存储在哪里。常见的假设是只有两个位置 - 一个位于 Github 等远程服务器上&#xff0c;另一个位于我们的本地计算机上。然而&#xff0c;这并不完全准确。 Git 在我们的机器上维护了三个本地存储&#xff0c;这意…