Spark中mapToPair和flatMapToPair的区别【附示例源码及运行结果】
本文重点介绍 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 分析的数据是基于一行行,类似于数据库的一条条记录那样。所以,我们可以理解为:
- map 是一条记录变一条记录的转换操作;适用于数据格式转换
- 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)}
}
示例代码运行结果截图如下:
文章最后,给大家推荐一些受欢迎的技术博客链接:
- Hadoop相关技术博客链接
- Spark 核心技术链接
- JAVA相关的深度技术博客链接
- 超全干货--Flink思维导图,花了3周左右编写、校对
- 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
- 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
- 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂
欢迎扫描下方的二维码或 搜索 公众号“10点进修”,我们会有更多、且及时的资料推送给您,欢迎多多交流!
Spark中mapToPair和flatMapToPair的区别【附示例源码及运行结果】相关推荐
- C语言从未排序的链接列表中删除重复项的算法(附完整源码)
C语言从未排序的链接列表中删除重复项的算法 C语言从未排序的链接列表中删除重复项的算法完整源码(定义,实现,main函数测试) C语言从未排序的链接列表中删除重复项的算法完整源码(定义,实现,main ...
- C语言用‘%20‘替换字符串中的所有空格的算法(附完整源码)
C语言用'%20'替换字符串中的所有空格的算法 C语言用'%20'替换字符串中的所有空格的算法完整源码(定义,实现,main函数测试) C语言用'%20'替换字符串中的所有空格的算法完整源码(定义,实 ...
- 【每天一个java设计模式(完)】 - 四万字实现23种设计模式(附示例源码)
什么是设计模式:[每天一个java设计模式(零)] - 设计模式基本概念及七大设计原则 创建型模式 工厂模式:[每天一个java设计模式(一)] - 工厂模式 抽象工厂模式: [每天一个java设计模 ...
- Java 动态代理详解 ( 附示例源码,建议收藏)
动态代理在Java中有着广泛的应用,比如Spring AOP.Hibernate数据查询.测试框架的后端mock.RPC远程调用.Java注解对象获取.日志.用户鉴权.全局性异常处理.性能监控,甚至事 ...
- 【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)...
转载请注明出处:http://blog.csdn.net/ns_code/article/details/20043459 前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃 ...
- python:实现统计一篇文章中每个单词出现的次数 (附完整源码)
python:实现统计一篇文章中每个单词出现的次数 文本分析是Python的一大利器.以下是一个简单的例子,用来统计一篇文章中每个单词出现的次数: text = "this is a sam ...
- Spark中foreachPartition和mapPartitions的区别
Spark中foreachPartition和mapPartitions的区别 spark的运算操作有两种类型:分别是Transformation和Action,区别如下: Transformatio ...
- JavaScript实现返回数字的二进制表示中使用的位数bitLength算法(附完整源码)
JavaScript实现返回数字的二进制表示中使用的位数bitLength算法(附完整源码) bitLength.js完整源代码 bitLength.js完整源代码 export default fu ...
- python codecs_python中转换模块codecs的讲解(附示例)
本篇文章给大家带来的内容是关于python中转换模块codecs的讲解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 0.编码 编码转换时,通常需要以unicode作为中间 ...
最新文章
- 2021 年 NLP 重要国际会议时间
- 排序算法 C++代码实现
- js 判断变量是否有值返回bool_基础 |判断 JS 中的变量类型竟然可以如此简单
- php memcached get,PHP Memcached操作类
- linux pdb创建表空间,ORACLE12C PDB创建默认表空间和用户语句(示例代码)
- html浮动标签调整位置,HTML 获取当前标签在页面的位置,并且把其他的浮动窗口显示过来...
- 力扣441.排列硬币
- 【Objective-C】探索Category底层的实质
- 因 Cannot resolve com.lowagie:itext:2.1.7.js6,选择手动安装 Jar 包进 Maven 仓库
- WCF Ria Service“操作失败,指定的命名链接在配置中找不到”错误解决方法
- linux USB摄像头 V4L2工具调试摄像头
- K3 Cloud 常用语法及常见异常
- 使用YYLabel编写直播间消息样式
- Word另存为PDF后无导航栏解决办法
- iphone计算机的声音,苹果电脑如何自定义声音怎么设置
- 租衣APP开发前景分析
- Bmob用户功能详解(三)
- STM32 - 独立看门狗IWDG - 使用注意事项+代码
- 【Android笔记50】Android应用如何获取系统服务(软键盘管理器、闹钟管理器)
- 高中计算机教师资格证面试怎么准备什么,高中信息技术教师资格证面试真题:数据的传输过程...