flink中使用lambda表达式
flink中使用lambda表达式
在
java8中有一种新的语法糖,即
lambda表达式,在
flink中,支持对所有的java api提供了 lambda的支持,但是存在一些限制,此处举一个例子,来说明如何在
flink中使用
lambda表达式,以及出错后如何处理。
参考链接:https://ci.apache.org/projects/flink/flink-docs-stable/dev/java_lambdas.html
1、使用lambda的一个示例
/**
* 测试 lambda 表达式在 flink 中的应用
* 不建议使用 lambda 表达式
* <p>
* 参考文章:https://ci.apache.org/projects/flink/flink-docs-stable/dev/java_lambdas.html
*
* @author huan.fu
* @date 2019-11-17 - 13:57
*/
public class FlinkLambdaJob {
public static void main(String[] args) throws Exception {
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
List<String> datas = Arrays.asList("aa,bb,ccc,dd,aa", "cc,dd,ee,ff,gg,aa");
DataSource<String> dataSource = env.fromCollection(datas);
dataSource.flatMap((String input, Collector<String[]> collector) -> {
collector.collect(input.split(","));
})
.flatMap((String[] words, Collector<Tuple2<String, Integer>> collector) -> {
Arrays.stream(words).map(word -> new Tuple2<>(word, 1)).forEach(collector::collect);
})
.groupBy(0)
.sum(1)
.print();
}
}
2、使用上面这种写法通常或得到如下错误
Exception in thread "main" org.apache.flink.api.common.functions.InvalidTypesException: The return type of function 'main(FlinkLambdaJob.java:26)' could not be determined automatically, due to type erasure. You can give type information hints by using the returns(...) method on the result of the transformation call, or by letting your function implement the 'ResultTypeQueryable' interface.
at org.apache.flink.api.java.DataSet.getType(DataSet.java:178)
at org.apache.flink.api.java.DataSet.flatMap(DataSet.java:266)
at com.huan.study.flink.lambda.FlinkLambdaJob.main(FlinkLambdaJob.java:29)
Caused by: org.apache.flink.api.common.functions.InvalidTypesException: The generic type parameters of 'Collector' are missing. In many cases lambda methods don't provide enough information for automatic type extraction when Java generics are involved. An easy workaround is to use an (anonymous) class instead that implements the 'org.apache.flink.api.common.functions.FlatMapFunction' interface. Otherwise the type has to be specified explicitly using type information.
at org.apache.flink.api.java.typeutils.TypeExtractionUtils.validateLambdaType(TypeExtractionUtils.java:350)
at org.apache.flink.api.java.typeutils.TypeExtractionUtils.extractTypeFromLambda(TypeExtractionUtils.java:176)
at org.apache.flink.api.java.typeutils.TypeExtractor.getUnaryOperatorReturnType(TypeExtractor.java:571)
at org.apache.flink.api.java.typeutils.TypeExtractor.getFlatMapReturnTypes(TypeExtractor.java:196)
at org.apache.flink.api.java.DataSet.flatMap(DataSet.java:266)
at com.huan.study.flink.lambda.FlinkLambdaJob.main(FlinkLambdaJob.java:26)
3、解决方案
默认情况下,flink可以从方法签名中获取范型信息,但是 void flatMap(IN value, Collector<OUT> out) 由javac编译后,会变成 void flatMap(IN value, Collector out),导致范型丢失,导致flink无法自动推断出类型,flink会认为是Object类型,从而导致无效的序列化类型。
有了以上认识,我们可以提供如下解决方案:
1、使用 匿名函数 来替代lambda表达式
2、从报错信息中,我们知道需要使用 returns方法来明确的指定返回类型
修改后的代码,此处使用 returns 方法来实现

4、建议
虽然使用 lambda表达式,在flink中代码变简洁了,但是需要增加额外的returns方法来明确的指定返回值类型,因此建议在flink中尽量少使用lambda表达式,可以使用匿名类来代替。不过这也看个人的习惯。
5、完整代码
flink中使用lambda表达式的更多相关文章
- 你知道C#中的Lambda表达式的演化过程吗
你知道C#中的Lambda表达式的演化过程吗? 阅读目录 委托的使用 匿名方法 Func和Action Lambda的诞生 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西 ...
- C#中的Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- C++11中的Lambda表达式
原文地址:C++中的Lambda表达式 作者:果冻想 一直都在提醒自己,我是搞C++的:但是当C++11出来这么长时间了,我却没有跟着队伍走,发现很对不起自己的身份,也还好,发现自己也有段时间没有写C ...
- Qt5中使用lambda表达式
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- Lambda 表达式,Java中应用Lambda 表达式
一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...
- 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join
在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...
- Qt5中的lambda表达式和使用lambda来写connect
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- Android中使用Lambda表达式开发
参考文章:ImportNew 要在Android开发中使用lambda表达式,首先需要在 Module 的build.gradle中加入: compileOptions { targetCompati ...
- 【转】你知道C#中的Lambda表达式的演化过程吗?
[转]你知道C#中的Lambda表达式的演化过程吗? 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传 ...
随机推荐
- Nginx:常用基本命令与异常处理
Nginx日志 - ./nginx-1.6.0-ems/logs/nginx.pid Nginx启动时应该使用cmd等命令行工具启动,双击启动同样会产生进程但会造成异常,判断条件是 ./nginx-1 ...
- 装配Bean的三种方式
一.装配Bean就是在xml写一个Bean标签:装配完Bean,还需要读取xml配置文件创建Spring容器来创建对象: 1.new 实现类方式 正常的三种创建Bean容器的方法都可以根据装配的Bea ...
- 以人为本打造“超职季”IP,58同城精准匹配企业招聘与打工人
撰文 |懂懂 编辑 | 秦言 来源:懂懂笔记 在大手笔培育IP的背后,58同城是如何考量的? 在餐厅当服务员的李阿姨今年54岁了.她的女儿马上研究生毕业,非常喜欢陈伟霆,手机屏保都是他.李阿姨没想到, ...
- 机器学习——主成分分析(PCA)
1 前言 PCA(Principal Component Analysis)是一种常用的无监督学习方法,是一种常用的数据分析方法. PCA 通过利用 正交变换 把由 线性相关变量 表示的观测数据转换为 ...
- CodeForce-812C Sagheer and Nubian Market(二分)
Sagheer and Nubian Market CodeForces - 812C 题意:n个货物,每个货物基础价格是ai. 当你一共购买k个货物时,每个货物的价格为a[i]+k*i. 每个货物只 ...
- 5.10学习总结——Activity的跳转和传值
使用sharedpreference是对信息的存储,也可以进行传值,今天通过查找资料,学习了Activity的跳转和传值方法. 跳转 1.显示跳转 4种方法 1 2 3 4 5 6 7 8 9 10 ...
- PTA——c++面向对象基础
1.结构不是面向对象的主要特征 2.每个 C++程序中都必须包含有这样一个函数,该函数的函数名为main 3.C++对C语言作了很多改进,下列描述中()使得C语言发生了质变,从面向过程变成了面向对象. ...
- Vue 初学
Vue 的基本代码: 概念简介:Vue.js 是目前最火的一个前端框架,只关注视图层,主要负责MVC中的V这一层 MVC 是后端的分层开发概念: MVVM是前端视图层的概念, ...
- animate.css VUE 使用
1.安装 npm i animate.css --save 2.引用 main.jsimport 'animate.css' 3.使用 <img v-show="welcomeinde ...
- linux中创建公私钥
linux中创建公私钥要再~(root)目录下ssh-keygencd /root/.ssh/lsid_rsa 是私钥id_rsa.pub 是公钥把 authorized_keys删除掉,重新建aut ...