函数类(Function Classes)和 富函数类(Rich Function Classes)

本文介绍了ApacheFlink中如何使用函数类(如MapFunction和RichFunction)进行数据处理,包括基础的接口实现、RichFunction的特性(如获取RuntimeContext和生命周期方法),以及使用RichMapFunction进行更复杂操作的示例。
摘要由CSDN通过智能技术生成

   

目录

函数类(Function Classes)

富函数类(Rich Function Classes)


函数类(Function Classes)

      Flink暴露了所有UDF函数的接口,具体实现方式为接口或者抽象类,例如MapFunction、FilterFunction、ReduceFunction等。所以用户可以自定义一个函数类,实现对应的接口。

java:

public class MapFunctionExample {  
    public static void main(String[] args) throws Exception {  
        // 创建流执行环境  
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();  
  
        // 创建一个数据源,例如从本地生成整数序列  
        DataStream<Integer> numbers = env.fromElements(1, 2, 3, 4, 5);  
  
        // 使用 MapFunction 将整数翻倍  
        DataStream<Integer> doubledNumbers = numbers.map(new MapFunction<Integer, Integer>() {  
            @Override  
            public Integer map(Integer value) throws Exception {  
                return value * 2;  
            }  
        });  
  
        // 打印结果到控制台  
        doubledNumbers.print();  
  
        // 执行流处理  
        env.execute("MapFunction Example");  
    }  
}

scala:

object MapFunctionExample {  
  def main(args: Array[String]): Unit = {  
    // 创建流处理环境  
    val env = StreamExecutionEnvironment.getExecutionEnvironment  
  
    // 创建输入数据源  
    val input = env.fromElements(1, 2, 3, 4, 5)  
  
    // 使用 MapFunction 将每个元素乘以 2  
    val output = input.map(new MapFunction[Int, Int] {  
      def map(value: Int): Int = {  
        value * 2  
      }  
    })  
  
    // 打印结果到控制台  
    output.print()  
  
    // 执行流处理作业  
    env.execute("MapFunction Example")  
  }  
}

富函数类(Rich Function Classes)

        “富函数”是 DataStream API 提供的一个函数类的接口,所有 Flink 函数类都有其 Rich 版本。它与常规函数的不同在于,可以获取运行环境的上下文,并拥有一些生命周期方法,所以可以实现更复杂的功能。

  •  RichMapFunction
  •  RichFlatMapFunction
  •  RichFilterFunction
  •  .................

Rich Function 有一个生命周期的概念。典型的生命周期方法有:

  • open()方法是 rich function 的初始化方法,当一个算子例如 map 或者 filter被调用之前 open()会被调用。
  • close()方法是生命周期中的最后一个调用的方法,做一些清理工作。
  • getRuntimeContext()方法提供了函数的 RuntimeContext 的一些信息,例如函数执行的并行度,任务的名字,以及 state 状态
// 富函数,可以获取到运行时上下文,还有一些生命周期
  class MyRichMap extends RichMapFunction[SensorReading, String]{

    override def open(parameters: Configuration): Unit = {
      //做一些初始化操作。比如map方法需要交互数据库,数据库连接可以在open里边做
      //getRuntimeContext()
    }

    override def map(value: SensorReading): String = {
      value.id + " temperature"
    }

    override def close(): Unit = {
      //map调用完之后。一般做收尾工作,比如关闭连接,或者清空状态
    }
  }

java:

public class RichMapExample {  
    public static void main(String[] args) throws Exception {  
        // 设置执行环境  
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();  
  
        // 创建数据源  
        env.fromElements("Hello", "World", "Flink")  
                .map(new RichMapFunction<String, Tuple2<String, Integer>>() {  
                    private int count = 0;  
  
                    @Override  
                    public Tuple2<String, Integer> map(String value) throws Exception {  
                        count++;  
                        System.out.println("Mapped value: " + value);  
                        return new Tuple2<>(value, count);  
                    }  
  
                    @Override  
                    public void open(Configuration parameters) throws Exception {  
                        super.open(parameters);  
                        // 在这里可以添加一些初始化代码,比如日志记录、度量等。  
                    }  
                })  
                // 添加简单的打印操作作为例子  
                .print();  
  
        // 执行任务  
        env.execute("Rich Map Function Example");  
    }  
}

scala:

object RichMapFunctionExample {  
  def main(args: Array[String]): Unit = {  
    // 创建流处理环境  
    val env = StreamExecutionEnvironment.getExecutionEnvironment  
  
    // 创建一个简单的数据源  
    val stream = env.fromElements(1, 2, 3, 4, 5)  
  
    // 使用 RichMapFunction 转换数据流  
    val transformedStream = stream.map(new RichMapFunction[Int, Int]() {  
      var stateValue: Option[Int] = None  
  
      override def open(config: Configuration): Unit = {  
        // 初始化状态描述器  
        val descriptor = new ValueStateDescriptor[Int]("state", classOf[Int])  
        stateValue = getRuntimeContext.getState(descriptor)  
      }  
  
      override def map(value: Int): Int = {  
        // 使用状态值进行转换  
        val transformedValue = stateValue match {  
          case Some(prevValue) => value + prevValue  
          case None => value  
        }  
        // 更新状态值  
        stateValue = Some(transformedValue)  
        transformedValue  
      }  
    })  
  
    // 打印结果到控制台  
    transformedStream.print()  
  
    // 执行作业  
    env.execute("RichMapFunction Example")  
  }  
}

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值