• Flink-v1.12官方网站翻译-P029-User-Defined Functions


    用户自定义函数

    大多数操作都需要用户定义的函数。本节列出了如何指定这些函数的不同方法。我们还涵盖了累加器,它可以用来深入了解您的Flink应用。

     Lambda函数

    在前面的例子中已经看到,所有的操作都接受lambda函数来描述操作。

    val data: DataSet[String] = // [...]
    data.filter { _.startsWith("http://") }
    

      

    val data: DataSet[Int] = // [...]
    data.reduce { (i1,i2) => i1 + i2 }
    // or
    data.reduce { _ + _ }
    

      

    富函数

    所有以lambda函数作为参数的变换都可以以富函数作为参数。例如,我们可以不使用

    data.map { x => x.toInt }
    

      

    你可以写

    class MyMapFunction extends RichMapFunction[String, Int] {
      def map(in: String):Int = { in.toInt }
    };
    

      

    并将该函数传递给地图变换。

    data.map(new MyMapFunction())
    

      

    富函数也可以定义为匿名类。

    data.map (new RichMapFunction[String, Int] {
      def map(in: String):Int = { in.toInt }
    })
    

      

    丰富的函数除了提供用户定义的函数(map、reduce等)外,还提供了四个方法:open、close、getRuntimeContext和setRuntimeContext。这些方法对于为函数设置参数(参见Passing Parameters to Functions)、创建和最终确定局部状态、访问广播变量(参见Broadcast Variables)、访问运行时信息(如累加器和计数器)以及迭代信息(参见Iterations)非常有用。

    累加器和计数器

    累积器是一个简单的构造,有一个加法运算和一个最终的累积结果,在工作结束后就可以使用。

    最直接的累加器是一个计数器,你可以使用Accumulator.add(V值)方法对它进行增量。你可以使用Accumulator.add(V值)方法来增加它。在作业结束时,Flink将对所有部分结果进行加总(合并),并将结果发送给客户端。累积器在调试期间或如果你快速想了解更多的数据时是很有用的。

    Flink目前有以下内置的累加器。它们每个都实现了Accumulator接口。

    • IntCounter、LongCounter和DoubleCounter。请看下面一个使用计数器的例子。
    • 直方图。一个离散数量的直方块的直方图实现。在内部,它只是一个从Integer到Integer的映射。你可以用它来计算值的分布,例如字数程序的每行字数分布。

    如何使用累加器

    首先,你必须在你想使用它的地方,在用户定义的转换函数中创建一个累加器对象(这里是一个计数器)。

    private IntCounter numLines = new IntCounter();
    

      

    其次,你必须注册累加器对象,通常是在富函数的open()方法中。在这里你还要定义名称。

    getRuntimeContext().addAccumulator("num-lines", this.numLines);
    

      

    现在你可以在操作函数的任何地方使用累加器,包括在open()和close()方法中。

    this.numLines.add(1);
    

      

    整体结果将存储在JobExecutionResult对象中,该对象由执行环境的execute()方法返回(目前只有在执行等待作业完成的情况下才有效)。

    myJobExecutionResult.getAccumulatorResult("num-lines")
    

      

    所有的累加器在每个作业中共享一个命名空间。因此你可以在你的工作的不同操作函数中使用同一个累加器。Flink会在内部合并所有同名的累加器。

    关于累加器和迭代的说明。目前,累加器的结果只有在整个作业结束后才会出现。我们计划在下一次迭代中也能获得上一次迭代的结果。你可以使用Aggregators来计算每次迭代的统计数据,并根据这些统计数据来终止迭代。

    自定义累加器

    要实现你自己的累加器,你只需要编写你的累加器接口的实现。如果你认为你的自定义累加器应该和Flink一起发布,请随时创建一个pull request。

    你可以选择实现Accumulator或SimpleAccumulator。

    Accumulator<V,R>是最灵活的。它为要添加的值定义了一个类型V,为最终结果定义了一个结果类型R。例如,对于一个直方图,V是一个数字,R是一个直方图。SimpleAccumulator适用于两种类型都相同的情况,例如计数器。

  • 相关阅读:
    第四章、数值计算
    一、bif
    十三、LaTex中的参考文献BibTex
    图像分类数据组织方式
    深度学习中loss总结
    类别不平衡问题
    各种优化器的比较
    机器学习优化器总结
    空洞卷积
    深度学习之语义分割中的度量标准
  • 原文地址:https://www.cnblogs.com/lukairui/p/14226564.html
Copyright © 2020-2023  润新知