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)
相关推荐
Hello_Embed6 小时前
STM32HAL 快速入门(十九):UART 编程(二)—— 中断方式实现收发及局限分析
笔记·stm32·单片机·嵌入式硬件·学习
天上的光7 小时前
关于学习的一些感悟
学习
打码人的日常分享7 小时前
运维服务方案,运维巡检方案,运维安全保障方案文件
大数据·运维·安全·word·安全架构
red_redemption7 小时前
自由学习记录(95)
学习
半夏陌离8 小时前
SQL 拓展指南:不同数据库差异对比(MySQL/Oracle/SQL Server 基础区别)
大数据·数据库·sql·mysql·oracle·数据库架构
东风西巷8 小时前
Balabolka:免费高效的文字转语音软件
前端·人工智能·学习·语音识别·软件需求
XISHI_TIANLAN10 小时前
【多模态学习】Q&A3:FFN的作用?Embedding生成方法的BERT和Word2Vec?非线性引入的作用?
学习·bert·embedding
A小弈同学10 小时前
新规则,新游戏:AI时代下的战略重构与商业实践
大数据·人工智能·重构·降本增效·电子合同
KFCcrazy411 小时前
嵌入式学习日记(39)51单片机
嵌入式硬件·学习·51单片机
MuMuMu#11 小时前
JAVA NIO学习笔记基础强化学习总结
java·学习·nio