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适用于两种类型都相同的情况,例如计数器。
Flink-v1.12官方网站翻译-P029-User-Defined Functions的更多相关文章
- Flink-v1.12官方网站翻译-P005-Learn Flink: Hands-on Training
学习Flink:实践培训 本次培训的目标和范围 本培训介绍了Apache Flink,包括足够的内容让你开始编写可扩展的流式ETL,分析和事件驱动的应用程序,同时省略了很多(最终重要的)细节.本书的重 ...
- Flink-v1.12官方网站翻译-P025-Queryable State Beta
可查询的状态 注意:可查询状态的客户端API目前处于不断发展的状态,对所提供接口的稳定性不做保证.在即将到来的Flink版本中,客户端的API很可能会有突破性的变化. 简而言之,该功能将Flink的托 ...
- Flink-v1.12官方网站翻译-P002-Fraud Detection with the DataStream API
使用DataStream API进行欺诈检测 Apache Flink提供了一个DataStream API,用于构建强大的.有状态的流式应用.它提供了对状态和时间的精细控制,这使得高级事件驱动系统的 ...
- Flink-v1.12官方网站翻译-P015-Glossary
术语表 Flink Application Cluster Flink应用集群是一个专用的Flink集群,它只执行一个Flink应用的Flink作业.Flink集群的寿命与Flink应用的寿命绑定. ...
- Flink-v1.12官方网站翻译-P008-Streaming Analytics
流式分析 事件时间和水印 介绍 Flink明确支持三种不同的时间概念. 事件时间:事件发生的时间,由产生(或存储)该事件的设备记录的时间 摄取时间:Flink在摄取事件时记录的时间戳. 处理时间:您的 ...
- Flink-v1.12官方网站翻译-P004-Flink Operations Playground
Flink操作训练场 在各种环境中部署和操作Apache Flink的方法有很多.无论这种多样性如何,Flink集群的基本构件保持不变,类似的操作原则也适用. 在这个操场上,你将学习如何管理和运行Fl ...
- Flink-v1.12官方网站翻译-P001-Local Installation
本地安装 按照以下几个步骤下载最新的稳定版本并开始使用. 第一步:下载 为了能够运行Flink,唯一的要求是安装了一个有效的Java 8或11.你可以通过以下命令检查Java的正确安装. java - ...
- Flink-v1.12官方网站翻译-P028-Custom Serialization for Managed State
管理状态的自定义序列化 本页面的目标是为需要使用自定义状态序列化的用户提供指导,涵盖了如何提供自定义状态序列化器,以及实现允许状态模式演化的序列化器的指南和最佳实践. 如果你只是简单地使用Flink自 ...
- Flink-v1.12官方网站翻译-P027-State Schema Evolution
状态方案的演变 Apache Flink流媒体应用通常被设计为无限期或长时间运行.与所有长期运行的服务一样,应用程序需要更新以适应不断变化的需求.这对于应用程序所针对的数据模式也是一样的,它们会随着应 ...
随机推荐
- docker frps 内网穿透容器化服务
准备 域名解析 将frp.xx.com解析到服务器ip,将泛域名 *.frp.xx.com解析到frp.xx.com即可 https证书申请 泛域名证书现在可以用acme.sh申请Let's Encr ...
- 软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结
本文主要阐述软件性能测试中的一些调优思想和技术,节选自作者新书<软件性能测试分析与调优实践之路>部分章节归纳. 在国内互联网公司中,Web中间件用的最多的就是Apache和Nginx这两款 ...
- sublime python 去掉单行超出字数的白色框框 (E501)
方法一 E501错误:行过长 (大于79个字符),在配置文件里设置 忽略E501错误即可 首选项-->Package Settings-->Anaconda-->Settings - ...
- 树莓派-4WD智能小车操作小结
树莓派-4WD智能小车操作小结 树莓派4B-4WD智能小车,双层结构,第一层结构为:小车扩展板(底层)+树莓派主板,通过铜柱隔离固定,小车扩展板相当于计算机的外设扩展板:上面一层为第二层,是三个舵机承 ...
- 【Java基础】异常处理
异常处理 异常概述 在 Java 语言中,将程序执行中发生的不正常情况称为"异常",但是开发过程中的语法错误和逻辑错误不是异常. 在执行过程中所发生的异常事件可分为两类: Erro ...
- SpringBoot整合Shiro完成认证
三.SpringBoot整合Shiro思路 首先从客户端发来的所有请求都经过Shiro过滤器,如果用户没有认证的都打回去进行认证,认证成功的,再判断是否具有访问某类资源(公有资源,私有资源)的权限,如 ...
- 克隆slave
在日常生活中,我们做的比较多的操作就是在线添加从库,比如线上有一主一丛两个数据库,由于业务的需要一台从库的读取量无法满足现在的需求,这样就需要我们在线添加从库,出于安全考虑,我们通常需要在从库上进行在 ...
- 【Web】CSS实现鼠标悬停实现显示与隐藏 特效
鼠标悬停实现显示与隐藏特效 简单记录 - 慕课网 Web前端 步骤四:鼠标悬停实现显示与隐藏特效 初步掌握定位的基本使用,以及CSS选择器更高级的运用,完成一个网页中必会的鼠标经过隐藏显示特效. 实现 ...
- 【Linux】如何查看命令来源于哪个包
Debian:(Ubuntu等) 先安装apt-file sudo apt-get install -y apt-file apt-file update 查询命令:(已查询ifconfig为例) r ...
- ctfhub技能树—信息泄露—svn泄露
打开靶机 查看页面信息 使用dvcs-ripper工具进行处理 ./rip-svn.pl -v -u http://challenge-3b6d43d72718eefb.sandbox.ctfhub. ...