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 >& ...
随机推荐
- SpringBoot路径匹配
Spring5.3 之后加入了更多的请求路径匹配的实现策略: 以前只支持 AntPathMatcher 策略, 现在提供了 PathPatternParser 策略.并且可以让我们指定到底使用那种策略 ...
- 【代码】JS|前端密码,浪漫至死不渝,祝我生日快乐
今天是特别的日子,我想把这篇存稿发出来. 一次缺席,次次缺席,便不再期待重逢. 也是时候,解开最后一个设计过的谜题. 学加密的同时,我恰好写前端比较多,也有朋友找我测试他们前端页面上的加密方案的安全性 ...
- 【Elasticsearch】一文读懂ES向量搜索:原理剖析与技术全景
大家好,我是大任,今天给大家分享一下Elasticsearch的向量搜索技术 注:本文若未说明ES版本则为7.10,其他版本会特别标记,由于ES版本不同,部分差异较大,具体请以官方文档为准 一.向量搜 ...
- 探秘Transformer系列之(32)--- Lookahead Decoding
探秘Transformer系列之(32)--- Lookahead Decoding 目录 探秘Transformer系列之(32)--- Lookahead Decoding 0x00 概述 0x0 ...
- React-Native开发鸿蒙NEXT-cookie设置
React-Native开发鸿蒙NEXT-cookie设置 应用有个积分商城,做一些积分兑换的业务,就一个基于react-native-webview开发的页面,在页面加载的时候通过js注入来设置co ...
- 洛谷 P3945 三体问题
洛谷 P3945 三体问题 在物竞dalao的帮助下(简化下?)终于A了此题,于是在他的提议下来喷出题人. 接下来看题. 题意分析 模拟三维空间中\(n\)个星体的运动,求\(Ts\)后\(n\)个星 ...
- FPGA使用两个HC595驱动8位数码管
FPGA使用两个HC595驱动8位数码管 本文章给出使用FPGA3根线来驱动8位数码管的示例代码,输入为disp_data,共7*8=56位,输出输入如图所示. 硬件方面参数 该程序只能控制数码管的7 ...
- 2025 年实用、全面的 VS Code 插件推荐!
前言 VS Code是一款由微软开源免费.轻量级.功能强大的源代码编辑器.其轻量级体现在基础安装简洁,仅含核心编辑功能.功能强大则源于它支持丰富的语言环境插件拓展,这种模块化设计让VS Code在源代 ...
- CRD的简单介绍
介绍 Custom Resource Define 简称 CRD,是 Kubernetes(v1.7+)为提高可扩展性,让开发者去自定义资源的一种方式. CRD 资源可以动态注册到集群中,注册完毕后, ...
- 文件服务器nginx-file-browser
说明 我们前面介绍过File Browser这款文件服务器的部署和使用,在部署和配置时可以控制权限和分享等功能,这里我们介绍一款更简单而且主题特别好看的文件服务器,不涉及权限的控制,直接可以对外分享. ...