news 2026/7/14 23:40:03

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/29 17:02:30

丙午新春乐韵奔腾:马年主题金曲榜

随着农历丙午马年春节的深入&#xff0c;根据最新音乐平台数据更新&#xff0c;马年主题新春歌曲排行榜出炉。大张伟的《阳光彩虹小白马》以其温暖治愈的旋律和恰逢其时的“马”主题&#xff0c;在多平台综合榜单中持续领先&#xff0c;成为今年新春期间传唱度最高的“马年第一…

作者头像 李华
网站建设 2026/7/1 10:12:23

【wordpress系列教程】05 文章分类与标签

在上一节课的末尾&#xff0c;我们看到在文章设置的最下面还有两个选项&#xff0c;分别是“分类目录”和“标签”。 分类可以体现出一篇文章的类别层级。比如我们可以设置一个“计算机”分类&#xff0c;下面可以写网站搭建、游戏开发相关的内容。在“网站搭建”分类下又可以写…

作者头像 李华
网站建设 2026/7/3 3:30:53

基于python的婚庆公司服务平台的设计与实现

目录摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 婚庆行业随着社会经济发展和消费升级呈现快速增长趋势&#xff0c;传统婚庆服务模式存在信息不透明、流程繁琐、资源整合不足等…

作者头像 李华
网站建设 2026/6/29 23:09:44

互联网教育平台如何优化百度编辑器的Word公式渲染速度?

【国企项目手记&#xff1a;企业网站后台管理系统富文本编辑器功能扩展开发全记录】 项目负责人&#xff1a;XXX&#xff08;北京某国企&#xff09; 日期&#xff1a;2023年X月X日 一、需求分析与技术选型 1. 核心需求梳理 客户要求在企业网站后台管理系统的文章发布模块中扩…

作者头像 李华
网站建设 2026/7/3 0:00:00

微信聊天记录永久保存全攻略:三步实现数据自主管理

微信聊天记录永久保存全攻略&#xff1a;三步实现数据自主管理 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMs…

作者头像 李华