Flink学习笔记之实现UDF函数--- 更细粒度的控制流

函数类(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的连接
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值