IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 4、Flink里的UDF函数 -> 正文阅读

[大数据]4、Flink里的UDF函数

一、函数类(Function Classes)

Flink暴露了所有udf函数的接口(实现方式为接口或者抽象类)。例如使用Map要实现MapFunction,使用Filter要实现FilterFunction,使用Process要实现ProcessFunction等等。
以Filter为例:

	//方式一,自定义外部类实现FilterFunction
    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");
        }
    });


    //方式三,定义成lambada表达式
    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();

执行结果:
在这里插入图片描述
设置了并行度为几,就有几个分区,每个分区都有一个类的实例。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:36:15  更:2022-03-10 22:38:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:25:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码