一、函数类(Function Classes)
Flink暴露了所有udf函数的接口(实现方式为接口或者抽象类)。例如使用Map要实现MapFunction,使用Filter要实现FilterFunction,使用Process要实现ProcessFunction等等。 以Filter为例:
DataStream<String> filterResult = stringDataStream.filter(new MyFilter());
public static class MyFilter implements FilterFunction<String>{
@Override
public boolean filter(String s) throws Exception {
return s.contains("flink");
}
}
DataStream<String> filterResult = stringDataStream.filter(new FilterFunction<String>() {
@Override
public boolean filter(String s) throws Exception {
return s.contains("flink");
}
});
DataStream<String> filterResult = stringDataStream.filter(data->data.contains("flink"));
上面三种方式都可以实现FilterFunction,但是只能进行固定的判断,如果想传入参数到类中,需要用以下的方式:
DataStream<String> filterResult = stringDataStream.filter(new MyFilter("flink"));
public static class MyFilter implements FilterFunction<String>{
private String keyword;
MyFilter(String keyword){
this.keyword=keyword;
}
@Override
public boolean filter(String s) throws Exception {
return s.contains(this.keyword);
}
}
二、富函数(Rich Functions)
“富函数”是DataStream API提供的一个函数类的接口,所有Flink函数类都有其Rich版本。它与常规函数的不同在于,可以获取运行环境的上下文,并拥有一些生命周期方法,所以可以实现更复杂的功能。 例如: 1)RichMapFunction 2)RichFlatMapFunction 3)RichFilterFunction … Rich Function有一个生命周期的概念。典型的生命周期方法有: open()方法是rich function的初始化方法,当一个算子例如map或者filter被调用之前opne()会被调用,可以做初始化工作。 close()方法是生命周期中最后一个调用的方法,做一些清理工作。 getRuntimeContext()方法提供了函数的RuntimeContext的一些信息,例如函数执行的并行度,任务的名字,以及state状态。 之前使用那些算子实现的只是最基础的函数,并没有实现富函数,所以上面三个方法都没办法使用。 以Map方法为例:
DataStream<Tuple2<Integer, String>> result = mapResult.map(new RichMapFunction<SensorReading, Tuple2<Integer, String>>() {
@Override
public Tuple2<Integer, String> map(SensorReading sensorReading) throws Exception {
return new Tuple2<>(getRuntimeContext().getIndexOfThisSubtask(), sensorReading.getId());
}
@Override
public void open(Configuration parameters) throws Exception {
System.out.println("my map open!!!");
}
@Override
public void close() throws Exception {
System.out.println("my map close!!!");
}
});
result.print();
env.execute();
执行结果: 设置了并行度为几,就有几个分区,每个分区都有一个类的实例。
|