本文重点介绍 Spark 中 【mapToPair】和【flatMapToPair】的区别,请继续看到尾部,后续有示例说明,会理解更加清晰。

函数原型

1.JavaPairRDD<K2,V2> mapToPair(PairFunction<T,K2,V2> f)

此函数会对一个RDD中的每个元素调用f函数,其中原来RDD中的每一个元素都是T类型的,调用f函数后会进行一定的操作把每个元素都转换成一个<K2,V2>类型的对象

2.JavaPairRDD<K2,V2> flatMapToPair(PairFlatMapFunction<T,K2,V2> f)

此函数对对一个RDD中的每个元素(每个元素都是T类型的)调用f函数,通过f函数可以将每个元素转换为<K2,V2>类型的元素,然后比mapToPair方法多了一个flat操作,将所有的<K2,V2>类型的元素合并成为一个Iterable<Tuple2<K2, V2>>类型的对象。

使用说明

在使用时mapToPair会将一个长度为N的、每个元素都是T类型的对象,转换成另一个长度为N的、每个元素都是<K2,V2>类型的对象;而flatMapToPair会在map的基础上进行一个flatten操作,即将所有的元素合并到一个Iterable<<K2,V2>>类型的集合中。

大白话说明

spark 分析的数据是基于一行行,类似于数据库的一条条记录那样。所以,我们可以理解为:

  1. map 是一条记录变一条记录的转换操作;适用于数据格式转换
  2. flatMap 是一条记录变多条记录的转换操作;适用于数据格式拆分同时进行数据转换

话不多说,直接上示例代码,如下:

JAVA 版本:

package com.java.spark_core.transform;import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;import java.util.Arrays;public class Java_Spark02_Oper1_mapVsflatmap {public static void main(String[] args) {Logger.getLogger("org").setLevel(Level.WARN);// var config: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount")SparkConf config = new SparkConf().setMaster("local[*]").setAppName("map");// 创建 Spark上下文对象// var sc: SparkContext = new SparkContext(config)JavaSparkContext sc = new JavaSparkContext(config);JavaRDD<String> listRDD = sc.parallelize(Arrays.asList("hello world", "hello spark"));// 所有RDD里的算子都是由 Executor 进行执行// map 算子System.out.println("=【map】操作 及 map操作结果打印 =======================");JavaRDD<String> mapRDD = listRDD.map(t -> t + "_1");mapRDD.collect().forEach(System.out::println);// flatMap 算子System.out.println("=【flatMap】操作 及 flatMap操作结果打印 =======================");JavaRDD<String> wordRdd = listRDD.flatMap(line -> Arrays.asList(line.split(" ")).iterator());wordRdd.collect().forEach(System.out::println);sc.close();}
}

Scala 版本:

package com.scala.spark_core.transformimport org.apache.log4j.{Level, Logger}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object Spark02_Oper1_mapVsflatmap {def main(args: Array[String]): Unit = {Logger.getLogger("org").setLevel(Level.WARN)var config: SparkConf = new SparkConf().setMaster("local[*]").setAppName("map")// 创建Spark上下文对象var sc: SparkContext = new SparkContext(config)// map算子var listRDD: RDD[String] = sc.makeRDD(Array("hello world", "hello spark")) // 所有RDD里的算子都是由 Executor 进行执行// map 算子System.out.println("=【map】操作 及 map操作结果打印 =======================")val mapRDD: RDD[String] = listRDD.map(_ + "_1")mapRDD.collect().foreach(println)// flatMap 算子System.out.println("=【flatMap】操作 及 flatMap操作结果打印 =======================")val wordRDD: RDD[String] = listRDD.flatMap(_.split(" "))wordRDD.collect().foreach(println)}
}

示例代码运行结果截图如下:


文章最后,给大家推荐一些受欢迎的技术博客链接

  1. Hadoop相关技术博客链接
  2. Spark 核心技术链接
  3. JAVA相关的深度技术博客链接
  4. 超全干货--Flink思维导图,花了3周左右编写、校对
  5. 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
  6. 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
  7. 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂

欢迎扫描下方的二维码或 搜索 公众号“10点进修”,我们会有更多、且及时的资料推送给您,欢迎多多交流!

Spark中mapToPair和flatMapToPair的区别【附示例源码及运行结果】相关推荐

  1. C语言从未排序的链接列表中删除重复项的算法(附完整源码)

    C语言从未排序的链接列表中删除重复项的算法 C语言从未排序的链接列表中删除重复项的算法完整源码(定义,实现,main函数测试) C语言从未排序的链接列表中删除重复项的算法完整源码(定义,实现,main ...

  2. C语言用‘%20‘替换字符串中的所有空格的算法(附完整源码)

    C语言用'%20'替换字符串中的所有空格的算法 C语言用'%20'替换字符串中的所有空格的算法完整源码(定义,实现,main函数测试) C语言用'%20'替换字符串中的所有空格的算法完整源码(定义,实 ...

  3. 【每天一个java设计模式(完)】 - 四万字实现23种设计模式(附示例源码)

    什么是设计模式:[每天一个java设计模式(零)] - 设计模式基本概念及七大设计原则 创建型模式 工厂模式:[每天一个java设计模式(一)] - 工厂模式 抽象工厂模式: [每天一个java设计模 ...

  4. Java 动态代理详解 ( 附示例源码,建议收藏)

    动态代理在Java中有着广泛的应用,比如Spring AOP.Hibernate数据查询.测试框架的后端mock.RPC远程调用.Java注解对象获取.日志.用户鉴权.全局性异常处理.性能监控,甚至事 ...

  5. 【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)...

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/20043459   前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃 ...

  6. python:实现统计一篇文章中每个单词出现的次数 (附完整源码)

    python:实现统计一篇文章中每个单词出现的次数 文本分析是Python的一大利器.以下是一个简单的例子,用来统计一篇文章中每个单词出现的次数: text = "this is a sam ...

  7. Spark中foreachPartition和mapPartitions的区别

    Spark中foreachPartition和mapPartitions的区别 spark的运算操作有两种类型:分别是Transformation和Action,区别如下: Transformatio ...

  8. JavaScript实现返回数字的二进制表示中使用的位数bitLength算法(附完整源码)

    JavaScript实现返回数字的二进制表示中使用的位数bitLength算法(附完整源码) bitLength.js完整源代码 bitLength.js完整源代码 export default fu ...

  9. python codecs_python中转换模块codecs的讲解(附示例)

    本篇文章给大家带来的内容是关于python中转换模块codecs的讲解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 0.编码 编码转换时,通常需要以unicode作为中间 ...

最新文章

  1. 2021 年 NLP 重要国际会议时间
  2. 排序算法 C++代码实现
  3. js 判断变量是否有值返回bool_基础 |判断 JS 中的变量类型竟然可以如此简单
  4. php memcached get,PHP Memcached操作类
  5. linux pdb创建表空间,ORACLE12C PDB创建默认表空间和用户语句(示例代码)
  6. html浮动标签调整位置,HTML 获取当前标签在页面的位置,并且把其他的浮动窗口显示过来...
  7. 力扣441.排列硬币
  8. 【Objective-C】探索Category底层的实质
  9. 因 Cannot resolve com.lowagie:itext:2.1.7.js6,选择手动安装 Jar 包进 Maven 仓库
  10. WCF Ria Service“操作失败,指定的命名链接在配置中找不到”错误解决方法
  11. linux USB摄像头 V4L2工具调试摄像头
  12. K3 Cloud 常用语法及常见异常
  13. 使用YYLabel编写直播间消息样式
  14. Word另存为PDF后无导航栏解决办法
  15. iphone计算机的声音,苹果电脑如何自定义声音怎么设置
  16. 租衣APP开发前景分析
  17. Bmob用户功能详解(三)
  18. STM32 - 独立看门狗IWDG - 使用注意事项+代码
  19. 【Android笔记50】Android应用如何获取系统服务(软键盘管理器、闹钟管理器)
  20. 高中计算机教师资格证面试怎么准备什么,高中信息技术教师资格证面试真题:数据的传输过程...

热门文章

  1. 从月薪8k到月薪30k,自动化测试究竟该怎样学...
  2. i18n 本地化_国际化与本地化(i18n与l10n)
  3. springboot+vue实现登录案例(附VUE整个项目代码)
  4. POI导入和导出Excel总结
  5. P106-90折腾总结
  6. spark ml 聚类源码笔记二
  7. python的研究方法有哪些_python有哪些提取文本摘要的库
  8. 修改本地host文件
  9. 程序员必备的VS调试技巧
  10. 三轮全向底盘实现绘图功能