函数类(Function Classes)
Flink 暴露了所有 udf 函数的接口(实现方式为接口或者抽象类)。例如 MapFunction,FilterFunction,ProcessFunction等等。
下面例子实现了 FilterFunction 接口:
方式1
DataStream<String> flinkTweets = tweets.filter(new FlinkFilter());
public static class FlinkFilter implements FilterFunction<String>{
@Override
public boolean filter(String value) throws Exception{
return value.contains("flink");
}
}
方式2
还可以将函数实现成匿名类
DataStream<String> flinkTweets = tweets.filter(new FliterFunction<String>(){
@Override
public boolean filter() throws Exception{
return value.contains("flink");
}
});
方式3
将 filter的字符串 "flink"还可以当参数传入
DataStream<String> tweets = env.readTextFile("INPUT_FILE");
DataStream<String> flinkTweets = tweets.filter(new KeyWordFilter("flink"));
public static class KeyWordFilter implements FilterFunction<String>{
private String keyWord;
KeyWordFilter(String keyWord) { this.keyWord = keyWord;}
@Override
public boolean filter(String value) throws Exception {
reutrn value.contains(this.keyWord);
}
}
匿名函数(Lambda Functions)
DataStream<String> tweets = env.readTextFile("INPUT_FILE");
DataStream<String> flinkTweets = tweets.filter(tweet -> tweet.contains("flink"));
富函数(Rich Functions)
"富函数" 是 DataStream API 提供的一个函数类的接口,所有 Flink 函数类都有其 Rich 版本。 它与常规函数的不同在于, 可以获取运行环境的上下文,并拥有一些生命周期方法,所以可以实现更复杂的功能。
- RichMapFunction
- RichFlatMapFunction
- RichFilterFunction
- .....
Rich Function 有一个生命周期的概念。典型的生命周期方法有:
- open() 方法是 rich function 的 初始化方法, 当一个算子例如 map 或者 filter 被调用之前 open() 会被调用
- close() 方法是生命周期中的最后一个调用的方法,做一些清理工作。
- getRuntimeContext() 方法提供了 函数的 RuntimeContext 的 一些信息,例如函数执行的并行度,任务的名字,以及state状态
public static class MyMapFunction extends RichMapFunction<SensorReading, Tuple2<Integer,String>>{
public Tuple2<Integer, String> map(SensorReading value) throws Exception {
return new Tuple2<Integer, String>(getRuntimeContext().getIndexOfThisSubtask(),value.getId());
}
@Override
public void open(Configuration parameters) throws Exception {
System.out.println("my map open");
// 以下可以做一些初始化工作,例如建立一个 和 HDFS 或者 数据库 的连接
}
@Override
public void close() throws Exception {
System.out.println("my map close");
// 以下做一些清理工作,例如断开和 HDFS的连接
}
}
}