Flink Window那些事——ReduceFunction窗口函数
ReduceFunction含义
ReduceFunction定义了如何把两个输入的元素进行合并来生成相同类型的输出元素的过程,Flink使用ReduceFunction来对窗口中的元素进行增量聚合
package com.lynch.stream.window;
import org.apache.flink.api.common.functions.ReduceFunction;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
/**
* 测试ReduceFunction
*
*/
public class TestReduceFunctionOnWindow {
public static void main(String[] args) throws Exception{
//获取执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//读取数据
DataStream<Tuple3<String,String,Integer>> input = env.fromElements(ENGLISH);
//keyBy(0) 计算班级总成绩,下标0表示班级
//countWindow(2) 根据元素个数对数据流进行分组切片,达到2个,触发窗口进行计算
DataStream<Tuple3<String,String,Integer>> totalPoints = input.keyBy(0).countWindow(2).reduce(new ReduceFunction<Tuple3<String, String, Integer>>() {
@Override
public Tuple3<String, String, Integer> reduce(Tuple3<String, String, Integer> value1, Tuple3<String, String, Integer> value2) throws Exception {
//效果如下:
//(class1,张三,100)
//(class1,李四,30)
//==============
System.out.println("" + value1);
System.out.println("" + value2);
System.out.println("==============");
return new Tuple3<>(value1.f0, value1.f1, value1.f2+value2.f2);
}
});
//输出结果
//效果如下:
//2> (class1,张三,130)
totalPoints.print();
env.execute("TestReduceFunctionOnWindow");
}
/**
* 定义班级的三元数组
*/
public static final Tuple3[] ENGLISH = new Tuple3[]{
//班级 姓名 成绩
Tuple3.of("class1","张三",100),
Tuple3.of("class1","李四",30),
Tuple3.of("class1","王五",70),
Tuple3.of("class2","赵六",50),
Tuple3.of("class2","小七",40),
Tuple3.of("class2","小八",10),
};
}
ReduceFunction执行返回结果
(class2,赵六,50)
(class2,小七,40)
==============
1> (class2,赵六,90)
(class1,张三,100)
(class1,李四,30)
==============
2> (class1,张三,130)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
2018-03-29 Docker容器绑定外部IP和端口
2018-03-29 Dockerfile文件制作自己的镜像