java dataset flatmap_Spark中map和flatMap的區別詳解

article/2025/10/18 9:59:49

a493737c1d3de7f8033eb5088b5f0fd0.png

本文介紹了Spark中map(func)和flatMap(func)這兩個函數的區別及具體使用。

函數原型

1.map(func)

將原數據的每個元素傳給函數func進行格式化,返回一個新的分佈式數據集。(原文:Return a new distributed dataset formed by passing each element of the source through a function func.)

2.flatMap(func)

跟map(func)類似,但是每個輸入項和成為0個或多個輸出項(所以func函數應該返回的是一個序列化的數據而不是單個數據項)。(原文:Similar to map, but each input item can be mapped to 0 or more output items (so func should return a Seq rather than a single item).)

使用說明

在使用時map會將一個長度為N的RDD轉換為另一個長度為N的RDD;而flatMap會將一個長度為N的RDD轉換成一個N個元素的集合,然後再把這N個元素合成到一個單個RDD的結果集。

比如一個包含三行內容的數據文件「README.md」。

a b c

d

經過以下轉換過程

val textFile = sc.textFile("README.md")

textFile.flatMap(_.split(" "))

其實就是經歷了以下轉換

["a b c", "", "d"] => [["a","b","c"],[],["d"]] => ["a","b","c","d"]

在這個示例中,flatMap就把包含多行數據的RDD,即[「a b c」, 「」, 「d」] ,轉換為了一個包含多個單詞的集合。實際上,flatMap相對於map多了的是[[「a」,」b」,」c」],[],[「d」]] => [「a」,」b」,」c」,」d」]這一步。

區別對比

map(func)函數會對每一條輸入進行指定的func操作,然後為每一條輸入返回一個對象;而flatMap(func)也會對每一條輸入進行執行的func操作,然後每一條輸入返回一個相對,但是最後會將所有的對象再合成為一個對象;從返回的結果的數量上來講,map返回的數據對象的個數和原來的輸入數據是相同的,而flatMap返回的個數則是不同的。請參考下圖進行理解:

spark-map-flatmap.jpg

通過上圖可以看出,flatMap其實比map多的就是flatten操作。

示例驗證

接下來,我們用一個例子來進行比較,首先在HDFS里寫入了這樣內容的一個文件:

C:\WINDOWS\system32>hadoop fs -cat hdfs://localhost:9000/user/input/wordcount.txt

word in text

hello spark

the third line

C:\WINDOWS\system32>

然後再spark里進行測試,如下

scala> var textFile =sc.textFile("hdfs://localhost:9000/user/input/wordcount.txt")

textFile: org.apache.spark.rdd.RDD[String] = hdfs://localhost:9000/user/input/wordcount.txt MapPartitionsRDD[1] at textFile at :27

map的結果

scala> var mapResult = textFile.map(line => line.split("\\s+"))

mapResult: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[2] at map at :29

scala> mapResult.collect

res0: Array[Array[String]] = Array(Array(word, in, text), Array(hello, spark), Array(the, third, line))

flatMap的結果

scala> var flatMapResult = textFile.flatMap(line => line.split("\\s+"))

flatMapResult: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at flatMap at :29

scala> flatMapResult.collect

res1: Array[String] = Array(word, in, text, hello, spark, the, third, line)

參考文章:

http://stackoverflow.com/questions/22350722/can-someone-explain-to-me-the-difference-between-map-and-flatmap-and-what-is-a-g;

http://spark.apache.org/docs/latest/programming-guide.html#transformations;

http://blog.csdn.net/samhacker/article/details/41927567;


http://chatgpt.dhexx.cn/article/mW59ibAD.shtml

相关文章

Spark中flatMap的操作

Test 1: package test.wyh.wordcountimport org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext}object TestFlatMap {def main(args: Array[String]): Unit {//建立Spark连接val sparkConf new SparkConf().setMaster("local&quo…

flatMap底层实现

上篇:Transformation的map使用 第一种方式重写flatMap方法实现 实现需求:根据字符串在nc -lk 8888的窗口命令下输入的数据,在控制台打印输出发现:在同一行数据输入的单词字符串自动换行,按每个单词独立换行并且若输入…

java7 flatmap_flink学习之七-map、fliter、flatmap

看完了Flink的datasource、sink,也就把一头一尾给看完了,从数据流入到数据流出,缺少了中间的处理环节。 而flink的大头恰恰是只在这个中间环节,如下图: source-transform-sink-update.png 中间的处理环节比较复杂&…

Stream之flatMap

一、flatMap简介 flatMap:将小Stream转换为大Stream 二、示例转换要求 目标:将如下对象中的分类category提取出来,去重。其中如"哲学,爱情",需要解析为两个分类,["哲学","爱情"] [{"age":33,"…

flatmap使用

使用场景 适用于嵌套list数据结构&#xff0c;想把内部的list数据合并成一个list.。 举例如下&#xff1a; public class Test {public static void main(String[] args) {List<List<String>> list new ArrayList<>();List<String> list1 new Arr…

Java8中map与flatMap用法

目录 1 概述 2 map与flatMap 3 常用写法 1 概述 Java8中一些新特性在平时工作中经常会用到&#xff0c;但有时候总感觉不是很熟练&#xff0c;今天特意将这个Java8中的映射记录一下。 2 map与flatMap map---对集合中的元素逐个进行函数操作映射成另外一个 flatMap---接收一…

如何使用flatMap

1. 什么情况下用到flatMap 当使用map&#xff08;&#xff09;操作时&#xff0c;不是返回一个值&#xff0c;而是返回一个集合或者一个数组的时候&#xff0c;这时候就可以使用flatMap解决这个问题。举个例子&#xff0c;你有一个列表 [21,23,42]&#xff0c;然后你调用getPr…

【JavaScript中数组的flatMap方法的详细介绍】

在我们平时对数组进行操作的时候&#xff0c;通常map、forEach和filter方法比较常用。而flatMap方法用得相对少一些。当你掌握了flatMap方法的使用之后&#xff0c;我相信你一定会喜欢上它的&#xff01; 下面我们会通过以下三个问题展开对flatMap方法的讲解&#xff1a; 1. f…

Java8 - Streams flatMap()

文章目录 官方文档What is flatMap()?Why flat a Stream?Demo需求1&#xff1a;Find all books需求2&#xff1a;Order and LineItems需求3&#xff1a;Splits the line by spaces需求4&#xff1a; flatMap and primitive type 官方文档 https://docs.oracle.com/javase/8/…

JAVA8 中的flatmap

构建对象 class User{private String addr } 将多个User集合中的addr按照;分割合并成一个字符串list List<User> uList Lists.newArrayList();User u1 new User();u1.setAddr("a1;a2;a3;a4;a5");User u2 new User();u2.setAddr("b1;b2;b3;b4;b5&qu…

Unity resource style/Theme.AppCompat.Dialog (aka xxx:style/Theme.AppCompat.Dialog) not found

关于Unity 打包报错"resource style/Theme.AppCompat.Dialog (aka com.game.chipsmerge:style/Theme.AppCompat.Dialog) not found."的问题 解决方法: 在mainTemplate文件中添加依赖: implementation ‘com.android.support:appcompat-v7:28.0.0’ 或者自己去下载其…

android最新v7包下载,support v7 appcompat.jar包下载

android support v7 appcompat.jar包是一款非常实用的jar文件,是android开发中必备的一份文件,能够在低版本Android平台上开发一个应用程序,兼容性极强。感兴趣的朋友欢迎前来IT猫扑下载体验吧! android support v7 appcompat.jar包介绍 android-support-v7-appcompat.jar包…

解决 appcompat 1.1.0 导致 webview crash 的问题

Android SDK 太不让人省心了&#xff0c;正式版本居然也埋雷。 前段时间把 support 升级到了 androidx&#xff0c;appcompat 自动升级了新版本 androidx.appcompat:appcompat:1.1.0。 简单回归了下功能就发上线了&#xff0c;结果在在 5.1 的系统上发生了大规模的 crash&…

从AppCompat切换到MaterialComponents一些主题属性介绍

文章目录 前言主题属性颜色排版字体形状小部件ButtonsText FieldsCardsBottom Navigation 后话 前言 絮叨两句&#xff0c;感觉Component这个库有点傲娇&#xff0c;我碰到一个情景&#xff0c;使用Button&#xff0c;设置了background属性&#xff0c;当使用样式是AppCompat时…

Gradle编译问题(appcompat和material相关)

在使用Android Studio编译项目时&#xff0c;发现的编译问题。已解决&#xff0c;在此记录一下 问题1 Cant determine type for tag <macro name"m3_comp_bottom_app_bar_container_color">?attr/colorSurface</macro> 原因是androidx.appcompat:app…

Android报错之You need to use a Theme.AppCompat theme (or descendant) with this activity.

[TOC](Android报错之You need to use a Theme.AppCompat theme (or descendant) with this activity.) 一、报错如下 原因为&#xff1a;Activty继承自android.support.v7.app.AppCompatActivty,而不是android.app.Activty。 二、解决方法 看一下提示&#xff0c;就是要用Th…

appcompat_v7项目说明

一、appcompat_v7项目说明 今天来说一下appcompat_v7项目的问题&#xff0c;使用eclipse创建Android项目时&#xff0c;发现project列表中会多创建出一个appcompat_v7项目&#xff0c;这是我搭建最新的Android开发环境创建第一个Android测试项目后发现的&#xff0c;我在创建An…

Android Studio报错Could not find any version that matches com.android.support:appcompat-v7:33.+.

今天用AndroidStudio新建了一个项目&#xff0c;没想到新建项目就爆红了 而且Java代码有标红&#xff0c;cannot reslove symbol"v7" 解决方案&#xff1a; 1.打开build.gradle文件&#xff0c;找到dependencies下 implementation com.android.support:appcompat-…

Android关于Theme.AppCompat相关问题的深入分析

先来看这样一个错误&#xff1a; No resource found that matches the given name style/Theme.AppCompat.Light 对于这个错误&#xff0c;相信大部分Android开发者都遇到过&#xff0c;可能很多朋友通过百度或者Google已经解决了这个问题&#xff0c;但是网上大部分都只给出…

细说 AppCompat 主题引发的坑:You need to use a Theme.AppCompat theme with this activity!

一般来说按照文档的建议去做&#xff0c;出现问题的概率很低。但很多人的情况不同&#xff0c;每每会发生意外状况&#xff0c;就比如这次没有使用 AppCompat 主题引发的坑&#xff01; AppCompat 框架作为 Jetpack 集合的基石&#xff0c;非常重要。Android Studio 上创建的默…