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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于VSCode+PlatformIO环境的ESP8266的HX1838红外模块

以下是针对ESP8266开发板的红外遥控解码系统开发教程,基于VSCodePlatformIO环境编写 一、概述 本实验通过ESP8266开发板实现: 红外遥控信号解码自定义按键功能映射串口监控输出基础设备控制(LED) 硬件组成: NodeMC…

Kubernetes排错(十四):Pod状态异常排查手册

当你在凌晨三点收到告警,发现Pod在崩溃循环中挣扎时,如何快速定位问题?本文将为你梳理一套生产环境通用的Pod排错流程,并附上救火队员必备的实用命令清单! 一、5分钟快速定位:四步锁定问题方向 步骤1&…

医院药品管理系统(准备工作)

准备工作 创建数据库表 搭建Springboot框架 创建工程 定位maven 其他准备工作 创建数据库表 建了九张表 搭建Springboot框架 创建工程 定位maven 把镜像改为国内的 其他准备工作 安装Lombok插件 额外添加依赖 如果添加依赖的过程中一直爆红,可以刷新…

SpringBoot异步处理@Async深度解析:从基础到高阶实战

一、异步编程基础概念 1.1 同步 vs 异步 特性同步异步执行方式顺序执行,阻塞调用非阻塞,调用后立即返回线程使用单线程完成所有任务多线程并行处理响应性较差,需等待前任务完成较好,可立即响应新请求复杂度简单直观较复杂&#…

简单的强化学习举例

1,定义奖励函数 首先,需要根据具体的任务需求来定义奖励函数。例如,对于机器人导航任务,可以根据机器人与目标点的距离来定义奖励函数: import numpy as npdef navigation_reward(robot_position, target_position):…

css背景相关

背景书写 background: url(src); // 注意:在写动态样式时,backgournd赋值格式错误,是不会在浏览器dom的style上显示的 // 但是可以创建不可见的img,预加载来提高性能背景也会加载图片资源 同img的src一样,background也…

opencascade.js stp vite 调试笔记

Hello, World! | Op enCascade.js cnpm install opencascade.js cnpm install vite-plugin-wasm --save-dev 当你不知道文件写哪的时候trae还是有点用的 ‘’‘ import { defineConfig } from vite; import wasm from vite-plugin-wasm; import rollupWasm from rollup/plug…

线程的一些事(2)

在java中,线程的终止,是一种“软性”操作,必须要对应的线程配合,才能把终止落实下去 然而,系统原生的api其实还提供了,强制终止线程的操作,无论线程执行到哪,都能强行把这个线程干掉…

BGP实验练习1

需求: 要求五台路由器的环回地址均可以相互访问 需求分析: 1.图中存在五个路由器 AR1、AR2、AR3、AR4、AR5,分属不同自治系统(AS),AR1 在 AS 100,AR2 - AR4 在 AS 200,AR5 在 AS …

滑动窗口——将x减到0的最小操作数

题目: 这个题如果我们直接去思考方法是很困难的,因为我们不知道下一步是在数组的左还是右操作才能使其最小。正难则反,思考一下,无论是怎么样的,最终这个数组都会分成三个部分左中右,而左右的组合就是我们…

C++ RAII机制

RAII(Resource Acquisition Is Initialization)是一种编程范式,核心思想是:资源的生命周期与对象绑定——对象创建时获取资源,对象销毁时自动释放资源。这种机制通过构造函数和析构函数的配对执行,确保资源…

连续抵消解码器--Successive Cancellation decoder(SC 解码器)

在这里,我们来看一下(Arikan,2009)中提供的连续取消解码算法。 顾名思义,SC解码算法从u0开始按顺序解码比特。 冻结的比特节点总是被解码为0。 在解码ui时,根据以下规则使用由向量表示的可用比特来解码u…

suricata之规则去重

一、环境和背景 1.1 环境 OS: Ubuntu 22.04.5 LTS IDE: vscode suricata: suricata 7.0.5 1.2 背景 在添加规则时,为了给规则分类,将不同类别的规则写入不同的文件。 在规则加载时两条不同的规则却被认为是重复的,因此记录一下去重逻辑。…

vue vite 无法热更新问题

一、在vue页面引入组件CustomEmployeesDialog,修改组件CustomEmployeesDialog无法热更新 引入方式: import CustomEmployeesDialog from ../dialog/customEmployeesDialog.vue 目录结构: 最后发现是引入import时,路径大小写与目…

深入理解 Linux 权限控制机制

引言 在 Linux 系统中,权限控制是保障系统安全的核心机制。通过限制用户对文件和资源的访问,它能有效防止未授权操作,保护数据不被篡改或泄露。合理设置权限不仅有助于实现用户隔离和最小权限原则,还能降低系统被滥用或攻击的风险…

Oracle版本、补丁及升级(12)——版本体系

12.1. 版本体系 Oracle作为最流行的一款关系数据库软件产品,其拥有自己一套成熟的版本管理体系。具体版本体系以12c为分界线,前后版本体系分别不同。 ​​​​​​​12.1.1. 12c之前版本 12c之前的Oracle,版本共有5位阿拉伯数字组成,其中的每位数字,都有各自的含义,具…

Maven 中的 pom.xml 文件

目录标题 1、根标签 <project> 的直接子标签顺序​2、常见子标签内部顺序​2.1、<build> 标签内部顺序2.2、<dependencies> 标签内部顺序 3、modelVersion 为什么是 4.0.0 &#xff1f;4、<parent> 标签&#xff1f;​​4.1、为什么需要 <parent>…

方案精读:华为与中软-智慧园区解决方案技术主打胶片【附全文阅读】

该文档是华为与中软国际的智慧园区轻量化解决方案推介&#xff0c;主要面向园区管理者、运营者及相关企业决策人。其核心围绕园区痛点&#xff0c;阐述智慧园区的发展趋势。 方案涵盖综合安防、便捷通行、设备管理等多领域应用场景&#xff0c;通过智能视频监控、人脸识别、远程…

# KVstorageBaseRaft-cpp 项目 RPC 模块源码学习

KVstorageBaseRaft-cpp 项目 RPC 模块源码学习 。 一、项目简介 KVstorageBaseRaft-cpp 是一个基于 Raft 一致性算法实现的分布式 KV 存储系统&#xff0c;采用 C 开发。项目的核心目标是帮助开发者理解 Raft 原理和分布式 KV 存储的基本实现。RPC 模块是分布式系统通信的关…

TeledyneLeCroy在OFC2025 EA展台上展示了其400G/800G的全包围的测试解决方案,满足了UEC联盟和UALINK联盟的技术需求

Teledyne LeCroy在OFC 2025上的EA展台 在2025年3月26日至28日于美国圣地亚哥举办的OFC&#xff08;Optical Fiber Communication Conference and Exhibition&#xff09;展会上&#xff0c;全球领先的测试测量解决方案提供商Teledyne LeCroy隆重展示了其最新研发的800G网络测试…