flink 1.11.2 学习笔记(5)-lambda表达式的使用问题
flink的api,提供了流畅的链式编程写法,写起来行云流水,感受一下:
SingleOutputStreamOperator<Tuple3<String, Integer, String>> counts = env
//设置并行度1,方便观察输出
.setParallelism(1)
//添加kafka数据源
.addSource(
new FlinkKafkaConsumer011<>(
SOURCE_TOPIC,
new SimpleStringSchema(),
props))
//转变成pojo对象
.map((MapFunction<String, WordCountPojo>) value -> {
WordCountPojo pojo = gson.fromJson(value, WordCountPojo.class);
return pojo;
})
//设置watermark以及事件时间提取逻辑
.assignTimestampsAndWatermarks(
new BoundedOutOfOrdernessTimestampExtractor<WordCountPojo>(Time.milliseconds(200)) {
@Override
public long extractTimestamp(WordCountPojo element) {
return element.eventTimestamp;
}
})
//统计每个word的出现次数
.flatMap(new FlatMapFunction<WordCountPojo, Tuple3<String, Integer, String>>() {
@Override
public void flatMap(WordCountPojo value, Collector<Tuple3<String, Integer, String>> out) throws Exception {
String word = value.word;
//获取每个统计窗口的时间(用于显示)
String windowTime = sdf.format(new Date(TimeWindow.getWindowStartWithOffset(value.eventTimestamp, 0, 60 * 1000)));
if (word != null && word.trim().length() > 0) {
//收集(类似:map-reduce思路)
out.collect(new Tuple3<>(word.trim(), 1, windowTime));
}
}
})
.keyBy(v -> v.f0)
//按1分钟开窗(TumblingWindows)
.timeWindow(Time.minutes(1))
//允许数据延时10秒
.allowedLateness(Time.seconds(10))
//将word的count汇总
.sum(1);
如果idea环境,使用jdk1.8的话,可能会智能提示,让你把24行改与lambda表达式,看上去更清爽一些:
SingleOutputStreamOperator<Tuple3<String, Integer, String>> counts = env
.setParallelism(1)
.addSource(
new FlinkKafkaConsumer011<>(
SOURCE_TOPIC,
new SimpleStringSchema(),
props))
.map((MapFunction<String, WordCountPojo>) value -> {
WordCountPojo pojo = gson.fromJson(value, WordCountPojo.class);
return pojo;
})
.assignTimestampsAndWatermarks(
new BoundedOutOfOrdernessTimestampExtractor<WordCountPojo>(Time.milliseconds(200)) {
@Override
public long extractTimestamp(WordCountPojo element) {
return element.eventTimestamp;
}
})
.flatMap((FlatMapFunction<WordCountPojo, Tuple3<String, Integer, String>>) (value, out) -> {
//改成lambda写法
String word = value.word;
String windowTime = sdf.format(new Date(TimeWindow.getWindowStartWithOffset(value.eventTimestamp, 0, 60 * 1000)));
if (word != null && word.trim().length() > 0) {
out.collect(new Tuple3<>(word.trim(), 1, windowTime));
}
})
.keyBy(v -> v.f0)
.timeWindow(Time.minutes(1))
.allowedLateness(Time.seconds(10))
.sum(1);
逻辑完全没变,但是运行后,会遇到一个报错:
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.
大致意思是,lambda写法无法提供足够的类型信息,无法推断出正确的类型,建议要么改成匿名类写法,要么用type information提供明细的类型信息。
解决方法:
SingleOutputStreamOperator<Tuple3<String, Integer, String>> counts = env
.setParallelism(1)
.addSource(
new FlinkKafkaConsumer011<>(
SOURCE_TOPIC,
new SimpleStringSchema(),
props))
.map((MapFunction<String, WordCountPojo>) value -> {
WordCountPojo pojo = gson.fromJson(value, WordCountPojo.class);
return pojo;
})
.assignTimestampsAndWatermarks(
new BoundedOutOfOrdernessTimestampExtractor<WordCountPojo>(Time.milliseconds(200)) {
@Override
public long extractTimestamp(WordCountPojo element) {
return element.eventTimestamp;
}
})
.flatMap((FlatMapFunction<WordCountPojo, Tuple3<String, Integer, String>>) (value, out) -> {
String word = value.word;
String windowTime = sdf.format(new Date(TimeWindow.getWindowStartWithOffset(value.eventTimestamp, 0, 60 * 1000)));
if (word != null && word.trim().length() > 0) {
out.collect(new Tuple3<>(word.trim(), 1, windowTime));
}
})
//明细指定返回类型
.returns(((TypeInformation) TupleTypeInfo.getBasicTupleTypeInfo(String.class, Integer.class, String.class)))
.keyBy(0)
.timeWindow(Time.minutes(1))
.allowedLateness(Time.seconds(10))
.sum(1);
27行这里,明细指定返回类型,同时keyBy的写法,略为调整下,就能正常运行了。
flink 1.11.2 学习笔记(5)-lambda表达式的使用问题的更多相关文章
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 高放的c++学习笔记之lambda表达式
lambda表达式:可以让代码看起来更整洁,有些结构简单且用的次数少的函数可以用lambda表达式替代, 通常结构是这样的[捕获列表](参数列表){函数部分} 捕获列表: lambda表达式如果在一个 ...
- Java学习笔记--Java8 Lambda表达式
Java Lambda表达式入门:http://blog.csdn.net/renfufei/article/details/24600507 lambda内容的介绍:http://swiftlet. ...
- java8学习笔记之lambda表达式
1.lambda表达式特点 lambda表达式可以理解为可传递的匿名函数的一种方式,无名称,但有参数列表和函数体以及返回类型,可能还有一个可抛出异常的列表. 2.lambda表达式基本语法 (para ...
- Python学习笔记:lambda表达式
lambda表达式:通常是在需要一个函数,但又不想去命名一个函数的时候使用,即匿名函数. 示例如下: add = lambda x,y : x+ y add(1,2) # 结果为3 1.应用在函数式编 ...
- Java8新特性学习笔记(一) Lambda表达式
没有用Lambda表达式的写法: Comparator<Transaction> byYear = new Comparator<Transaction>() { @Overr ...
- java学习笔记06--正则表达式
java学习笔记06--正则表达式 正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证.拆分.替换等操作. 例如:现在要去判断一个字符串是否由数字组成,则可以有以下的两种做法 不使用正则 ...
- Dart学习笔记-运算符-条件表达式-类型转换
Dart学习笔记-运算符-条件表达式-类型转换 一.运算符 1.算术运算符 + (加)- (减)* (乘)/ (除)~/ (取整) %(取余) 2.关系运算符 == (等等) != (不等) > ...
- C++ 11学习(1):lambda表达式
转载请注明,来自:http://blog.csdn.net/skymanwu #include <iostream> #include <vector> #include &l ...
- [Python学习笔记-002] lambda, map, filter and reduce
1. lambda lambda, 即匿名函数,可以理解为跟C语言的宏类似.例如: >>> max = lambda x, y: x if x > y else y >& ...
随机推荐
- K8s新手系列之K8s架构
应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署 互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与缺点:不能为应用程序定义资源使用边界,很难合理地分 ...
- 为React组件库引入自动化测试:从零到完善的实践之路
为什么我们需要测试? 我们的 React+TypeScript 业务组件库已经稳定运行了一段时间,主要承载各类UI展示组件,如卡片.通知等.项目初期,迫于紧张的开发周期,我们暂时搁置了自动化测试的引入 ...
- 探索 Rust:从基础语法到实用概念
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- SpringBoot3整合SpringSecurity6(四)添加用户、密码加密
写在前面 还记得在之前的文章中,我们在user表中手动插入了3条数据吗? 当时,大家就会有疑问.这一串密码是怎么来的呢,我们为啥要对密码进行加密? 带着这些疑问,我们继续上路.我们在开发一个应用系统, ...
- 一个加速github的简单方法
除了使用梯子外,我们可以在本地host文件里添加ip来使之更为稳定: Windows用户在C:\Windows\System32\drivers\etc下的hosts文件里的底部添加如下内容: # G ...
- 由 Array.includes 函数引发对引用数据类型的思考
`` 数组的includes方法在日常的编程中比较常用到,其作用就是判断某一数据是否在数组中,通常来说,数组中的数据如果是数字,布尔值,或者字符串的话,都是能够进行判断的 例如: [1,2,3,4]. ...
- 解密prompt系列54.Context Cache代码示例和原理分析
Context Cache的使用几乎已经是行业共识,目标是优化大模型首Token的推理延时,在多轮对话,超长System Prompt,超长结构化JSON和Few-shot等应用场景,是不可或缺的.这 ...
- React-Native开发鸿蒙NEXT-video
React-Native开发鸿蒙NEXT-video 前几周的开发,基本把一个"只读型"社区开发的差不多了.帖子列表,详情,搜索都迁移实现了,但还差了一点------视频类型帖子的 ...
- 注解@Transactional事务失效的常见场景
在<Spring Boot事务管理>中,小编介绍了注解@Transactional的基本属性和使用方法,这里介绍事务失效的八种场景,使大家对注解@Transactional有一个更深刻的认 ...
- 【pr】利用lrc快速导入歌曲的歌词
确保你的bgm是原汁原味的,没有经过变速或剪辑 下载lrc https://www.musicenc.com/ pr不能直接导入lrc,需要将lrc转换成srt https://www.lrccon. ...