实现函数
我们在上面的转换过程中,经常使用函数,这次我们就详细讲解下DataStream API中定义和参数化函数的方式.
Flink中所有用户自定义函数,都是接口或者抽象类的形式对外暴露的.
比如我们实现一个FilterFunction,过滤了所有包含flink一词的字符串
当然一个函数在初始化的时候可以具有属性,比如我们创建一个FilterFunction,并传入一个字符串作为过滤条件
当然由于程序提交执行的时候,所有参数都会利用Java自身的序列化机制进行序列化,并发送到对应算子的并行任务,这样反序列化后,也可以保留配置
如果有无法序列化的对象实例,那么可以使用富函数 rich function进行初始化或者覆盖Java的序列化和反序列化方法.
而且Flink中的函数大抵都是支持Lambda方式书写的,Lambda函数可以使用于Scala和Java,以一种简单的方式说明业务逻辑
最后,Flink提供了富函数,这是一种比正常函数包含更多信息,提供更多功能的函数
DataStream API中所有的转换函数都有对应的富函数,和一般的函数比起来,富函数在前面加上了Rich,比如 RichMapFunction,RichFlatMapFunction
比如使用富函数的时候,具有两个额外的方法.
open()方法,进行初始化,在首次调用任务的时候进行处罚,往往进行一些初始化设置操作.
close()方法,作为终止方法,每个人物最后一次调用的时候调用一次,进行清理和释放资源
而且在其中,还可以利用getRuntimeContext()方法访问函数的RuntimeContext,其中包含了函数的并行度,函数所在子任务的编号,还有任务名称