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

flink学习之窗口处理函数

窗口处理函数

什么是窗口处理函数

Flink 本身提供了多层 API,DataStream API 只是中间的一环,在更底层,我们可以不定义任何具体的算子(比如 map(),filter(),或者 window()),而只是提炼出一个统一的“处理”(process)操作——它是所有转换算子的一个概括性的表达,可以自定义处理逻辑,所以这一层接口就被叫作“处理函数”(process function)。
在这里插入图片描述

如何使用窗口处理函数

进行窗口计算,我们可以直接调用现成的简单聚合方法(sum()/max()/min()),也可以通过调用 reduce()或 aggregate()来自定义一般的增量聚合函数(ReduceFunction/AggregateFucntion);
而对于更加复杂、需要窗口信息和额外状态的一些场景,我们还可以直接使用全窗口函数、把数据全部收集保存在窗口内,等到触发窗口计算时再统一处理。窗口处理函数就是一种典型的全窗口函数。
窗 口 处 理 函 数 ProcessWindowFunction 的 使 用 与 其 他 窗 口 函 数 类 似 , 也 是 基 于
WindowedStream 直接调用方法就可以,只不过这时调用的是 process()

stream.keyBy(_._1).window( TumblingEventTimeWindows.of(Time.seconds(10)) ).process(new MyProcessWindowFunction)

rocessWindowFunction 是一个继承了 AbstractRichFunction 的抽象类,它有四个类型
参数:
IN:input,数据流中窗口任务的输入数据类型。
OUT:output,窗口任务进行计算之后的输出数据类型。
KEY:数据中键 key 的类型。
W:窗口的类型,是 Window 的子类型。一般情况下我们定义时间窗口,W 就是
TimeWindow。

因为全窗口函数不是逐个处理元素的,所以处理数据的方法在这里并不是 processElement(),
而是改成了 process()。方法包含四个参数。

  • key:窗口做统计计算基于的键,也就是之前 keyBy()用来分区的字段。
  • context:当前窗口进行计算的上下文,它的类型就是
  • ProcessWindowFunction 内部定 义的抽象类 Context。
  • elements:窗口收集到用来计算的所有数据,这是一个可迭代的集合类型。 out:用来发送数据输出计算结果的收集器,类型为Collector。

可以明显看出,这里的参数 elements 不再是一个输入数据,而是窗口中所有数据的集合。

ProcessWindowFunction 中除.process()方法外,并没有 onTimer()方法,而是多出了一个
clear()方法,这主要是方便我们进行窗口的清理工作。
至于另一种窗口处理函数 ProcessAllWinfdowFunction,它的用法非常类似。区别在于它基
于的是 AllWindowedStream,相当于对没有 keyBy()的数据流直接开窗并调用 process()方法:

stream.windowAll( TumblingEventTimeWindows.of(Time.seconds(10)) )
.process(new MyProcessAllWindowFunction)

相关文章:

  • 【算法练习】leetcode算法题合集之动态规划篇
  • 防火墙在企业园区出口安全方案中的应用(ENSP实现)
  • 网络安全进阶试题——附答案
  • GPT-5不叫GPT-5?下一代模型会有哪些新功能?
  • VR数字展厅,平面静态跨越到3D立体化时代
  • 决策树的基本构建流程
  • 选择排序(堆排序和topK问题)
  • live555搭建流式rtsp服务器
  • 电脑文件mfc140.dll丢失的解决方法指导,怎么快速修复mfc140.dll
  • Vue2学习之第六、七章——vue-router与ElementUI组件库
  • GPS位置虚拟软件 AnyGo mac激活版
  • 机器学习 | 深入探索Numpy的高性能计算能力
  • 【LeetCode: 148. 排序链表 + 链表 + 归并排序】
  • ffmpeg 实用命令 -- 设置预览图
  • 【.NET Core】深入理解任务并行库 (TPL)
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Debian下无root权限使用Python访问Oracle
  • Github访问慢解决办法
  • HTML5新特性总结
  • Javascript设计模式学习之Observer(观察者)模式
  • Netty 4.1 源代码学习:线程模型
  • vue数据传递--我有特殊的实现技巧
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 基于Android乐音识别(2)
  • 前端技术周刊 2019-02-11 Serverless
  • 前端面试之CSS3新特性
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 写代码的正确姿势
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #QT(一种朴素的计算器实现方法)
  • (Java数据结构)ArrayList
  • (接口封装)
  • (利用IDEA+Maven)定制属于自己的jar包
  • (南京观海微电子)——I3C协议介绍
  • (三) diretfbrc详解
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (原創) 未来三学期想要修的课 (日記)
  • (转)创业家杂志:UCWEB天使第一步
  • (转)大型网站的系统架构
  • (转)关于pipe()的详细解析
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET构架之我见
  • 。Net下Windows服务程序开发疑惑
  • [C++]高精度 bign (重载运算符版本)
  • [CERC2017]Cumulative Code
  • [codeforces]Recover the String
  • [CSS]CSS 字体属性
  • [hdu1561] The more, The Better 【树形DP】