深入理解groupByKey、reduceByKey区别——本质就是一个local machine的reduce操作
下面来看看groupByKey和reduceByKey的区别:
val conf = new SparkConf().setAppName("GroupAndReduce").setMaster("local") val sc = new SparkContext(conf) val words = Array("one", "two", "two", "three", "three", "three") val wordsRDD = sc.parallelize(words).map(word => (word, 1)) val wordsCountWithReduce = wordsRDD. reduceByKey(_ + _). collect(). foreach(println) val wordsCountWithGroup = wordsRDD. groupByKey(). map(w => (w._1, w._2.sum)). collect(). foreach(println)
虽然两个函数都能得出正确的结果, 但reduceByKey函数更适合使用在大数据集上。 这是因为Spark知道它可以在每个分区移动数据之前将输出数据与一个共用的key
结合。
借助下图可以理解在reduceByKey里发生了什么。 在数据对被搬移前,同一机器上同样的key
是怎样被组合的( reduceByKey中的 lamdba 函数)。然后 lamdba 函数在每个分区上被再次调用来将所有值 reduce成最终结果。整个过程如下:
另一方面,当调用 groupByKey时,所有的键值对(key-value pair) 都会被移动,在网络上传输这些数据非常没必要,因此避免使用 GroupByKey。
为了确定将数据对移到哪个主机,Spark会对数据对的key
调用一个分区算法。 当移动的数据量大于单台执行机器内存总量时Spark
会把数据保存到磁盘上。 不过在保存时每次会处理一个key
的数据,所以当单个 key 的键值对超过内存容量会存在内存溢出的异常。 这将会在之后发行的 Spark 版本中更加优雅地处理,这样的工作还可以继续完善。 尽管如此,仍应避免将数据保存到磁盘上,这会严重影响性能。
你可以想象一个非常大的数据集,在使用 reduceByKey 和 groupByKey 时他们的差别会被放大更多倍。
摘自:http://www.jianshu.com/p/0c6705724cff
转载于:https://www.cnblogs.com/bonelee/p/7111395.html
深入理解groupByKey、reduceByKey区别——本质就是一个local machine的reduce操作相关推荐
- 【C 语言】数组 ( 多维数组本质 | 步长角度 理解 多维数组本质 )
文章目录 一.从 步长角度 理解 多维数组本质 二.代码示例 一.从 步长角度 理解 多维数组本质 声明一个二维数组 ; // 声明一个多维数组int array[2][3]; 二级指针 : arra ...
- groupByKey、reduceByKey区别(转)
转载自: https://www.cnblogs.com/bonelee/p/7111395.html spark-shell 下: 代码如下: val words = Array("one ...
- Spark中distinct、reduceByKey和groupByKey的区别与取舍
1. 代码实例: a. val rdd = sc.makeRDD(Seq("aa", "bb", "cc", "aa", ...
- 视频教程-C语言-从汇编角度理解C语言的本质-C/C++
C语言-从汇编角度理解C语言的本质 擅长JavaWeb开发,游戏逆向外挂与反外挂,游戏保护对抗 孙冉 ¥49.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅 ...
- 1 OC 对象的本质(一个NSObject 对象占用的内存大小)
1 前言 目录 1 前言 2 一个NSObject占用多少内存 3 为什么呢 ? 4 如何在内存中看呢? OC 的面向对象都是基于C/C++ 的数据结构实现的 结构体 2 clang 命令转换成c++ ...
- R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解、使用gtExtras包添加一个图,显示表中某一列中的数字
R语言使用gt包和gtExtras包优雅地.漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解.使用gtExtras包添加一个图,显示表中某一列中的数字 目录
- R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解、使用gtExtras包添加一个图,显示表中某一列中的数字、并为类型数据添加图像符号标签
R语言使用gt包和gtExtras包优雅地.漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解.使用gtExtras包添加一个图,显示表中某一列中的数字.并为类型数据添加图像符号标签 目 ...
- AQS理解之二,自己设计一个锁
AQS理解之二,自己设计一个锁 一,实现锁的条件 首先我们想一想,如果我们自己实现一个类似于java中的锁,我们可能需要哪些必要的东西: 1,记录是哪个线程持有了锁. 2,如果有一个变量代表加锁,A线 ...
- 堆和栈的区别,有一个64k的字符串,是放到堆上,还是放到栈上,为什么?
堆和栈的区别,有一个64k的字符串,是放到堆上,还是放到栈上,为什么? 答:只有引用及基本数据类型是直接存在栈上.对象类型可能是在堆.方法区.常量池中. 如二楼所说,放到堆中还是放到栈中,jvm会根据 ...
最新文章
- .NET中IDisposable接口的基本使用
- PowerPivot—无法从数据模型中获取数据
- [译] APT分析报告:03.OpBlueRaven揭露APT组织Fin7/Carbanak(上)Tirion恶意软件
- vue插槽的使用(slot)
- LeetCode 1409. 查询带键的排列(map模拟)
- nginx解决浏览器跨域问题_前端通过Nginx反向代理解决跨域问题
- C++面向对象笔记:构造、析构函数、成员函数
- VUE3(template使用)
- PacketSender —— TCP/UDP 包测试工具
- sdk 今日头条_Unity接入今日头条广告(激励广告)
- Java工程师学习指南
- ico图标制作的在线工具
- poj 3295 Tautology
- 【MATLAB数字图像处理】伪彩色增强
- 30多个HTML5经典动画应用展示
- MT6737模块编译方法
- EI检索的期刊要怎么区别是否是EI检索
- 2022/1/23(每周总结)
- 智能投影机android系统,智能投影机
- Windows10关闭指定端口号命令