当前位置: 首页 > news >正文

spark:map 和 flatMap 的区别(Scala)

场景设定

假设有一个包含句子的 RDD:

scala

val rdd = sc.parallelize(List("Hello World", "Hi Spark"))  

目标是:将每个句子拆分成单词


1. 用 map 的效果

代码示例

scala

val resultMap = rdd.map(sentence => sentence.split(" "))
resultMap.collect()
输出结果

scala

Array[Array[String]] = Array(Array("Hello", "World"), Array("Hi", "Spark"))
发生了什么?
  • map 一对一转换:

    • 输入一个句子 "Hello World" → 输出一个单词数组 Array("Hello", "World")

    • 输入一个句子 "Hi Spark" → 输出一个单词数组 Array("Hi", "Spark")

  • 结果结构嵌套的数组(每个元素还是数组)。


2. 用 flatMap 的效果

代码示例

scala

val resultFlatMap = rdd.flatMap(sentence => sentence.split(" "))
resultFlatMap.collect()
输出结果

scala

Array[String] = Array("Hello", "World", "Hi", "Spark")
发生了什么?
  • flatMap 一对多转换:

    • 输入一个句子 "Hello World" → 拆分成两个单词 "Hello" 和 "World"

    • 输入一个句子 "Hi Spark" → 拆分成两个单词 "Hi" 和 "Spark"

  • 结果结构扁平化的数组(所有单词在一个数组中)。


核心区别总结

操作输入 → 输出关系结果结构适用场景
map1个输入 → 1个输出(类型可变)保持嵌套结构简单转换(如类型转换、数值计算)
flatMap1个输入 → 多个输出(自动展平)扁平化单层结构拆分数据(如分词、展开嵌套结构)

图解对比

原始数据:          List("Hello World", "Hi Spark")  ↓               ↓  
map 处理:      Array("Hello", "World")   Array("Hi", "Spark") → 结果:嵌套数组  |         |            |        |  
flatMap 处理:  "Hello"    "World"     "Hi"     "Spark"      → 结果:扁平数组

什么时候用 map

  • 保留结构:比如将字符串转大写、对数字做运算。

    scala

    val numbers = sc.parallelize(List(1, 2, 3))
    val doubled = numbers.map(_ * 2)  // 输出:List(2, 4, 6)

什么时候用 flatMap

  • 拆分或展开数据:比如将句子拆成单词、展开嵌套集合。

    scala

    val nestedList = sc.parallelize(List(List(1, 2), List(3, 4)))
    val flattened = nestedList.flatMap(identity)  // 输出:List(1, 2, 3, 4)

高级用法

链式调用示例

scala

// 同时使用 map 和 flatMap
val sentences = sc.parallelize(List("Hello World", "Hi Spark"))// 步骤分解:
// 1. 用 map 将句子转大写
// 2. 用 flatMap 拆分单词
val result = sentences.map(_.toUpperCase).flatMap(_.split(" "))result.collect()  // 输出:Array("HELLO", "WORLD", "HI", "SPARK")

一句总结

map 是变形,flatMap 是拆开压平!
需要保持结构用 map,需要展开数据用 flatMap

相关文章:

  • RDD 两类操作详解(Scala):转换与行动
  • 【PDF】使用Adobe Acrobat dc添加水印和加密
  • 深度解析:可视化如何重塑销售策略制定与执行
  • c++实现分数操作
  • 基于Dockers的Bitwarden的私有本地部署
  • 深度剖析多模态大模型中的视频编码器算法
  • 《大模型微调实战:Llama 3.0全参数优化指南》
  • c++面向对象:接口设计
  • MYSQL数据库集群高可用和数据监控平台
  • JAVA EE_网络原理_网络层
  • 机器视觉开发教程——C#如何封装海康工业相机SDK调用OpenCV/YOLO/VisionPro/Halcon算法
  • 《设计模式之禅》笔记
  • Win全兼容!五五 Excel Word 转 PDF 工具解决多场景转换难题
  • 【github分享】开发者学习路线图
  • 前端代理问题
  • 技术书籍推荐(002)
  • spark运行架构及核心组件介绍
  • 使用go开发安卓程序
  • 用户线程和守护线程
  • 如何配置光猫+路由器实现外网IP访问内部网络?
  • 福建厦门市副市长、市公安局局长陈育煌出任吉林省公安厅厅长
  • 迪奥部分客户数据遭泄露,公司称正持续展开调查
  • 小米SU7 Ultra风波升级:数百名车主要求退车,车主喊话雷军“保持真诚”
  • 哈马斯表示已释放一名美以双重国籍被扣押人员
  • 山东鄄城发生一起交通事故,造成4人死亡、2人受伤
  • 视觉周刊|纪念苏联伟大卫国战争胜利80周年