一、依赖

参考博文:https://www.cnblogs.com/robots2/p/16048648.html

二、代码

package net.xdclass.class9;

import java.util.Date;

import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.ReduceFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import net.xdclass.model.VideoOrder; /**
* @desc reduce算子,和sum类似,sum做简单聚合,reduce做复杂聚合
* aggregate支持更复杂聚合
* @menu
*/
public class FLink12KeyByReduceApp { public static void main(String[] args) throws Exception{
//WebUi方式运行
// final StreamExecutionEnvironment env =
// StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//设置运行模式为流批一体
env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
//并行度
env.setParallelism(1);
//设置为自定义source
// DataStream<VideoOrder> ds = env.addSource(new VideoOrderSourceV2());
DataStream<VideoOrder> ds = env.fromElements(
new VideoOrder("20190242812", "springboot教程", 10,1001, new Date()),
new VideoOrder("20194350812", "微服务SpringCloud", 20,1001, new Date()),
new VideoOrder("20190814232", "Redis教程", 30,1001, new Date()),
new VideoOrder("20190523812", "⽹⻚开发教程", 40,1001, new Date()),
new VideoOrder("201932324", "百万并发实战Netty", 50,1001, new Date()),
new VideoOrder("20190242812", "springboot教程", 10,1001, new Date()),
new VideoOrder("20190814232", "Redis教程", 30,1001, new Date())); KeyedStream<VideoOrder, Object> videoOrderObjectKeyedStream = ds.keyBy(new KeySelector<VideoOrder, Object>() {
@Override
public Object getKey(VideoOrder videoOrder) throws Exception {
return videoOrder.getTitle();
}
}); //reduce,做聚合。合并数据,返回新的聚合对象。大于两条才会触发
SingleOutputStreamOperator<VideoOrder> reduceResult = videoOrderObjectKeyedStream.reduce(
new ReduceFunction<VideoOrder>() {
@Override
public VideoOrder reduce(VideoOrder value1, VideoOrder value2) throws Exception {
VideoOrder reduceOrder = new VideoOrder();
reduceOrder.setTitle(value1.getTitle());
reduceOrder.setMoney(value1.getMoney() + value2.getMoney());
return reduceOrder;
}
}); reduceResult.print(); //DataStream需要调用execute,可以取个名称
env.execute("reduce map job");
}
}

随机推荐

  1. 用谷歌经典ML方法方法来设计生成式人工智能语言模型

    上一篇:<人工智能模型学习到的知识是怎样的一种存在?> 序言:在接下来的几篇中,我们将学习如何利用 TensorFlow 来生成文本.需要注意的是,我们这里并不使用当前最热门的 Trans ...

  2. canvas(三)绘制矩形

    1.绘制矩形轨迹 相关语法:ctx.rect(x,y,width,height),根据传入的参数(起始坐标和宽高)用来绘制一个矩形轨迹 注意:ctx.rect()和ctx.lineTo()绘制的都是轨 ...

  3. 西门子PLC与上位机通信方案梳理

    一.前言 大家好!我是付工. 西门子PLC是工控领域使用非常多的一种PLC品牌,对于上位机开发人员来说,对于西门子PLC的通信,我们一般可以采取哪些通信方式呢? 今天跟大家分享一下上位机实现与西门子P ...

  4. 斐波那契数列(Java实现)

    斐波那契数列 题目描述: 悲波那契数列(Fibonacci sequence)又称黄金分割数列,因数学家莱昂纳多·裴波那契(LeonardodaFibonacci)以兔子繁殖为例子而引入,故又称为&q ...

  5. 4 步缩减 Script Evaluation Time

    4 步缩减脚本评估时间 (Script Evaluation Time) https://touch.marfeel.com/resources/blog/reduce-script-evaluati ...

  6. GraphQL Part VII: 实现数据变更

    我们已经可以使用各种方式来获取数据了.但是如何修改服务器端的数据呢?包括数据插入,修补,删除或者更新等等.GraphQL 的 mutation 就是负责这部分的. 在我们继续之前,我想对项目做一点调整 ...

  7. 2024年1月Java项目开发指南7:增删改查与接口测试

    我们之前,是从Controller层写到Service层,然后mapper层. 接下来我们反过来,从mapper层写到Controller层 两种方式都可以,你喜欢就行,甚至你先写service层也可 ...

  8. ctr命令的基本使用与技巧

    k8s早1.24后放弃docker,并把containerd作为运行时组件,containerd 调用链更短,组件更少,更稳定,占用节点资源更少 ctr是containerd的一个客户端工具 cric ...

  9. Qt/C++编写视频监控系统80-远程回放视频流

    一.前言 远程回放NVR或者服务器上的视频文件,一般有三种方式,第一种是调用厂家的SDK,这个功能最全,但是缺点明显就是每个厂家的设备都有自己的SDK,只兼容自家的设备,如果你的软件需要接入多个厂家的 ...

  10. Qt开发经验小技巧251-255

    今天在一个头文件中,发现 #ifdef Q_OS_WIN #ifdef Q_CC_MSVC 之类的都失效了,搞得差点怀疑人生了.经历过之前类似的教训后,排查原来是没有提前引入 qglobal.h 头文 ...