news 2026/5/16 7:49:18

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/5/12 3:36:40

基于大数据的淘宝月季销售预测数据可视化系统 爬虫

目录爬虫技术摘要数据处理与分析系统价值开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;爬虫技术摘要 淘宝月季销售预测数据可视化系统的爬虫模块旨在高效获取商品销售、评价及用户行为数据…

作者头像 李华
网站建设 2026/5/2 12:37:13

基于python框架的房产交易服务平台的设计与实现

目录房产交易服务平台的设计与实现摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;房产交易服务平台的设计与实现摘要 该平台基于Python框架开发&#xff0c;旨在为用户提供高效、安全的…

作者头像 李华
网站建设 2026/5/1 4:14:14

LLM提示工程让遗传咨询更精准

&#x1f4dd; 博客主页&#xff1a;Jax的CSDN主页 LLM提示工程&#xff1a;精准遗传咨询的革命性突破 目录 LLM提示工程&#xff1a;精准遗传咨询的革命性突破 引言&#xff1a;遗传咨询的精准化困局 一、提示工程如何重塑遗传咨询全流程 1. 从痛点到价值&#xff1a;维度一的…

作者头像 李华
网站建设 2026/5/10 23:17:03

基于51/STM32单片机自动售货机扫码支付无人超市缺货补货语音设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于51/STM32单片机自动售货机扫码支付无人超市缺货补货语音设计STM32-S144-4种商品4路步进电机出货选货支付库存缺货提醒找零声光提醒按键TFT彩屏(无线方式选择) STM32-S144N无无线-无APP版: STM32-S144B蓝牙无线-APP版: STM32-S144W-WIFI无线-APP版: STM32-S144CAN-视频监控W…

作者头像 李华
网站建设 2026/5/11 15:06:35

免费Claude接入终极指南:5分钟搭建个人AI代理服务

免费Claude接入终极指南&#xff1a;5分钟搭建个人AI代理服务 【免费下载链接】AIClient-2-API Simulates Gemini CLI, Qwen Code, and Kiro client requests, compatible with the OpenAI API. It supports thousands of Gemini model requests per day and offers free use o…

作者头像 李华
网站建设 2026/5/3 3:01:37

高效VR视频下载全攻略:N_m3u8DL-RE专业工具深度解析

高效VR视频下载全攻略&#xff1a;N_m3u8DL-RE专业工具深度解析 【免费下载链接】N_m3u8DL-RE 跨平台、现代且功能强大的流媒体下载器&#xff0c;支持MPD/M3U8/ISM格式。支持英语、简体中文和繁体中文。 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …

作者头像 李华