函数类(Function Classes)
Flink暴露了所有UDF函数的接口(实现方式为接口或者抽象类)。例如MapFunction, FilterFunction, ProcessFunction等等。
下面例子实现了FilterFunction接口:
还可以将函数实现成匿名类
我们filter的字符串"flink"还可以当作参数传进去。
匿名函数(Lambda Functions)
“富函数”是DataStream API提供的一个函数类的接口,所有Flink函数类都有其Rich版本。
它与常规函数的不同在于,可以获取运行环境的上下文,并拥有一些生命周期方法,所以可以实现更复杂的功能。
- RichMapFunction
- RichFlatMapFunction
- RichFilterFunction
- …
Rich Function有一个生命周期的概念。典型的生命周期方法有:
open()
方法是rich function的初始化方法,当一个算子例如map或者filter被调用之前open()
会被调用。
close()
方法是生命周期中的最后一个调用的方法,做一些清理工作。
getRuntimeContext()
方法提供了函数的RuntimeContext的一些信息,例如函数执行的并行度,任务的名字,以及state状态
富函数(Rich Functions)
“富函数”是DataStream API提供的一个函数类的接口,所有Flink函数类都有其Rich版本。
它与常规函数的不同在于,可以获取运行环境的上下文,并拥有一些生命周期方法,所以可以实现更复杂的功能。
- RichMapFunction
- RichFlatMapFunction
- RichFilterFunction
- …
Rich Function有一个生命周期的概念。典型的生命周期方法有:
open()
方法是rich function的初始化方法,当一个算子例如map或者filter被调用之前open()
会被调用。
close()
方法是生命周期中的最后一个调用的方法,做一些清理工作。
getRuntimeContext()
方法提供了函数的RuntimeContext的一些信息,例如函数执行的并行度,任务的名字,以及state状态
测试代码:
输出
由于设置了执行环境env的并行度为4,所以有4个slot执行自定义的RichFunction,输出4次open和close