news 2026/6/15 17:39:51

Flink 核心算子详解:map / flatMap / filter / process

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink 核心算子详解:map / flatMap / filter / process

文章目录

  • 一、算子能力对照表
  • 二、测试数据
  • 三、map:一进一出
  • 四、filter:只负责“要不要”
  • 五、flatMap:一进多出
  • 六、process:最底层、最强大的算子
  • 七、如何选择算子?
  • 八、总结

在学习 Flink 的过程中,mapflatMapfilterprocess是最常用、也是最容易让人迷糊的几个算子。

很多初学者都会有这些疑问:

  • 为什么flatMap里一定要写Collector
  • 为什么map不能返回多个元素?
  • process到底强在哪里?什么时候该用?

本文将从接口设计出发,结合可运行 Demo + 实际运行结果,带你真正理解 Flink 算子的设计思想。


一、算子能力对照表

算子输入 → 输出是否可丢数据是否可多输出是否可用时间/状态
map1 → 1
filter1 → 0/1
flatMap1 → 0/N
process1 → 0/N

一句话总结:

越简单的算子,约束越多,Flink 能优化得越好;
越底层的算子,能力越强,但责任全在你。


二、测试数据

hello flink hello world

三、map:一进一出

1. 接口定义

publicinterfaceMapFunction<T,R>{Rmap(Tvalue)throwsException;}

特点:

  • 一个输入
  • 必须返回一个输出
  • 不能多、不能少

2. Demo:字符串转大写

StreamExecutionEnvironmentenv=StreamExecutionEnvironment.getExecutionEnvironment();DataStream<String>source=env.fromElements("hello flink","hello world");source.map(value->value.toUpperCase()).print();try{env.execute("Simple Map Example");}catch(Exceptione){thrownewRuntimeException(e);}

DataStream 程序是惰性执行的,必须调用 execute() 才会触发作业执行

3. 运行结果

8> HELLO WORLD 7> HELLO FLINK

四、filter:只负责“要不要”

1. 接口定义

publicinterfaceFilterFunction<T>{booleanfilter(Tvalue)throwsException;}

注意:

  • 不能修改数据
  • 只能决定保留 or 丢弃

2. Demo:只保留包含 flink 的行

source.filter(line->line.contains("flink")).print();

3. 运行结果

6> hello flink

五、flatMap:一进多出

1. 接口定义

publicinterfaceFlatMapFunction<T,O>{voidflatMap(Tvalue,Collector<O>out)throwsException;}

2. 为什么要Collector

因为:

flatMap 允许一条输入,输出 0 条、1 条或多条数据

返回值已经不够用,所以 Flink 把“输出控制权”交给你。


3. Demo:拆分单词

source.flatMap((Stringline,Collector<String>out)->{for(Stringword:line.split(" ")){out.collect(word);}}).returns(Types.STRING)// ⭐ 关键:补全类型信息.print();

4. 运行结果

4> hello 4> world 3> hello 3> flink

六、process:最底层、最强大的算子

map / filter / flatMap 能做的,process 全都能做
并且还能:

  • 获取时间
  • 使用状态
  • 注册定时器

1. 接口结构

publicabstractclassProcessFunction<I,O>{publicabstractvoidprocessElement(Ivalue,Contextctx,Collector<O>out)throwsException;}

2. Demo:手写 WordCount(不使用 keyBy.sum)

source.keyBy(value->value).process(newProcessFunction<String,Tuple2<String,Integer>>(){privateintcount=0;@OverridepublicvoidprocessElement(Stringvalue,Contextctx,Collector<Tuple2<String,Integer>>out){count++;out.collect(Tuple2.of(value,count));}}).print();

3. 运行结果

3> (hello flink,1) 6> (hello world,1)

⚠️ 注意:这里只是演示process能力
实际生产应使用Keyed State而不是普通成员变量


七、如何选择算子?

官方推荐原则:

能用 map,就别用 flatMap
能用 flatMap,就别用 process

原因是:

  • 简单算子 → Flink 能做更多优化
  • process → 灵活但难维护、难调优

八、总结

  • map:最简单,1 → 1
  • filter:只做判断
  • flatMap:拆分、多输出
  • process:终极武器,慎用

理解算子 ≠ 记 API
理解算子 = 理解接口设计 + 数据流模型

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 14:13:58

WordPress如何实现Ctrl+V直接粘贴Word图片并自动上传?

要求&#xff1a;开源&#xff0c;免费&#xff0c;技术支持 博客&#xff1a;WordPress 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 功能&#xff1a;导入Word,导入Excel,导入PPT(PowerPoint),导入PDF,复制粘贴word,导入微信公众号内容,web截屏 平台&#xff1a;Window…

作者头像 李华
网站建设 2026/6/15 15:24:00

我们离AI有人类般的记忆还有多远?

北京通用人工智能研究院&#xff08;BIGAI&#xff09;院长、北京大学讲席教授朱松纯团队在TMLR期刊上发布了一篇重磅综述研究。研究对AI的记忆进行了全面的梳理。记忆不仅是过往经验的存档&#xff0c;更是智能体进行推理、规划与持续进化的核心驱动力。这篇关于大模型记忆机制…

作者头像 李华
网站建设 2026/6/15 16:38:10

汽车电子研发如何通过百度富文本编辑器处理CAD图纸注释?

老张的CMS企业官网外包项目日记&#xff1a;给UEditor加上Word粘贴神功 Day 1&#xff1a;接到需求时的懵逼时刻 "什么&#xff1f;要在UEditor里实现Word一键粘贴&#xff1f;还要支持Latex公式转MathML&#xff1f;"我看着需求文档&#xff0c;感觉头发又少了几根。…

作者头像 李华
网站建设 2026/6/10 12:29:56

汽车制造企业网页如何实现大附件分片上传的源码?

【一个.NET程序员的悲喜交加&#xff1a;前端搞定了&#xff0c;后端求包养&#xff01;】 各位道友好&#xff01;俺是山西某个人.NET程序员&#xff0c;刚啃完《C#从入门到住院》&#xff0c;就被客户按头要求搞个20G大文件上传下载系统。现在前端用Vue3原生JS硬怼出了半成品…

作者头像 李华