下面来看看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成最终结果。整个过程如下:

image

另一方面,当调用 groupByKey时,所有的键值对(key-value pair) 都会被移动,在网络上传输这些数据非常没必要,因此避免使用 GroupByKey。

为了确定将数据对移到哪个主机,Spark会对数据对的key调用一个分区算法。 当移动的数据量大于单台执行机器内存总量时Spark会把数据保存到磁盘上。 不过在保存时每次会处理一个key的数据,所以当单个 key 的键值对超过内存容量会存在内存溢出的异常。 这将会在之后发行的 Spark 版本中更加优雅地处理,这样的工作还可以继续完善。 尽管如此,仍应避免将数据保存到磁盘上,这会严重影响性能。

image

你可以想象一个非常大的数据集,在使用 reduceByKey 和 groupByKey 时他们的差别会被放大更多倍。

摘自:http://www.jianshu.com/p/0c6705724cff

转载于:https://www.cnblogs.com/bonelee/p/7111395.html

深入理解groupByKey、reduceByKey区别——本质就是一个local machine的reduce操作相关推荐

  1. 【C 语言】数组 ( 多维数组本质 | 步长角度 理解 多维数组本质 )

    文章目录 一.从 步长角度 理解 多维数组本质 二.代码示例 一.从 步长角度 理解 多维数组本质 声明一个二维数组 ; // 声明一个多维数组int array[2][3]; 二级指针 : arra ...

  2. groupByKey、reduceByKey区别(转)

    转载自: https://www.cnblogs.com/bonelee/p/7111395.html spark-shell 下: 代码如下: val words = Array("one ...

  3. Spark中distinct、reduceByKey和groupByKey的区别与取舍

    1. 代码实例: a. val rdd = sc.makeRDD(Seq("aa", "bb", "cc", "aa", ...

  4. 视频教程-C语言-从汇编角度理解C语言的本质-C/C++

    C语言-从汇编角度理解C语言的本质 擅长JavaWeb开发,游戏逆向外挂与反外挂,游戏保护对抗 孙冉 ¥49.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅 ...

  5. 1 OC 对象的本质(一个NSObject 对象占用的内存大小)

    1 前言 目录 1 前言 2 一个NSObject占用多少内存 3 为什么呢 ? 4 如何在内存中看呢? OC 的面向对象都是基于C/C++ 的数据结构实现的 结构体 2 clang 命令转换成c++ ...

  6. R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解、使用gtExtras包添加一个图,显示表中某一列中的数字

    R语言使用gt包和gtExtras包优雅地.漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解.使用gtExtras包添加一个图,显示表中某一列中的数字 目录

  7. R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解、使用gtExtras包添加一个图,显示表中某一列中的数字、并为类型数据添加图像符号标签

    R语言使用gt包和gtExtras包优雅地.漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解.使用gtExtras包添加一个图,显示表中某一列中的数字.并为类型数据添加图像符号标签 目 ...

  8. AQS理解之二,自己设计一个锁

    AQS理解之二,自己设计一个锁 一,实现锁的条件 首先我们想一想,如果我们自己实现一个类似于java中的锁,我们可能需要哪些必要的东西: 1,记录是哪个线程持有了锁. 2,如果有一个变量代表加锁,A线 ...

  9. 堆和栈的区别,有一个64k的字符串,是放到堆上,还是放到栈上,为什么?

    堆和栈的区别,有一个64k的字符串,是放到堆上,还是放到栈上,为什么? 答:只有引用及基本数据类型是直接存在栈上.对象类型可能是在堆.方法区.常量池中. 如二楼所说,放到堆中还是放到栈中,jvm会根据 ...

最新文章

  1. .NET中IDisposable接口的基本使用
  2. PowerPivot—无法从数据模型中获取数据
  3. [译] APT分析报告:03.OpBlueRaven揭露APT组织Fin7/Carbanak(上)Tirion恶意软件
  4. vue插槽的使用(slot)
  5. LeetCode 1409. 查询带键的排列(map模拟)
  6. nginx解决浏览器跨域问题_前端通过Nginx反向代理解决跨域问题
  7. C++面向对象笔记:构造、析构函数、成员函数
  8. VUE3(template使用)
  9. PacketSender —— TCP/UDP 包测试工具
  10. sdk 今日头条_Unity接入今日头条广告(激励广告)
  11. Java工程师学习指南
  12. ico图标制作的在线工具
  13. poj 3295 Tautology
  14. 【MATLAB数字图像处理】伪彩色增强
  15. 30多个HTML5经典动画应用展示
  16. MT6737模块编译方法
  17. EI检索的期刊要怎么区别是否是EI检索
  18. 2022/1/23(每周总结)
  19. 智能投影机android系统,智能投影机
  20. Windows10关闭指定端口号命令

热门文章

  1. Linux内核中的进程等待与其实现解析
  2. python中 s是什么意思_什么是Pandas?Pandas学习什么?
  3. vba字典合并单元格为空_VBA合并单元格求和处理套路
  4. php中的替换函数,php字符串中替换函数是什么
  5. linux下vim编辑器的基本使用
  6. 深度学习中Flatten层的作用
  7. 【Linux入门到精通系列讲解】Linux如何创建和删除swap分区
  8. 【Ubuntu入门到精通系列讲解】远程管理常用命令速查
  9. DL之决策树(Decision tree)
  10. 图像标记工具Labelme和LabelImg