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.pswp.cn/web/79412.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79412.shtml
英文地址,請注明出處:http://en.pswp.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網絡測試…