可互加微信,方便交流(备注请求时注明CSDN来的朋友):a917655983
在什么场景中使用富函数?
许多时候我们需要在函数处理第一条记录之前就进行一些初始话工作或是取得函数运行时相关的上下文信息。
如何使用富函数?
我定义了一个map算子,现在我如果要在map算子在处理第一条记录之前,就想取得该函数运行时的相关信息,和进行一些初始话工作。那么代码就应当类似于如下方式:
**.map(x=> 定义一个富函数)
富函数中的方法open()/close()
在使用富函数的时候,我们可以对函数的生命周期实现两个额外的方法:
- open():
- 是富函数的初始方法。它在每个任务首次调用转换方法(如map,flter等算子)前调用一次。Open方法通常只用于那些只需要进行一次的设置工作
- close():
- 函数的终止方法,会在每个任务最后一次调用转换方法后调用一次。通常用于清理和释放资源。
- 此外,还可以使用getRuntimeContext()方法来访问函数的RuntimeContext,从RuntimeContext中获取一些信息,例如函数的并行度,访问分区状态的方法等… …
如何通过代码实现一个富函数?
举例:
我想要在使用map算子处理计算的时候,连接数据库,这个连接的代码只会运行一次,后续不会再运行,就可以利用富函数的初始话方法来进行定义.
这里我以flatMap富函数举例:
class flatMap_rich extends RichFlatMapFunction<In,Out>{
override def open(configuration:Confuration) : kic Unit = {} //创建初始话函数,例如创建和外部系统的连接
override def flatMap(in : In,out:Collector<Out>)() :Unit = {} //做一些操作
override def close : Unit = {} //做一些清理工作,例如关闭和外部系统的连接
}