请教Spark 中 combinebyKey 和 reduceByKey的传入函数参数的区别?

代码如下
val testData = sc.parallelize(Seq(("t1", 1), ("t1", 2), ("t1", 3), ("t2", 2), ("t2", 5)))
val testDataCombine = testData.combineByKey(x=>x,(x:Int,y:Int)=>x+y,(x:Int,y:Int)=>x+y)
val testDataReduce = testData.reduceByKey((x,y)=>x+y)这两个函数 在combineByKey 传入函数参数的时候
为什么一定要指定x ,y的Int类型,如果不指定会报错没发识别"+"这个方法符,
而reduceByKey的时候可以不用指定而进行系统推断。
作者:连城
链接:https://www.zhihu.com/question/45420080/answer/99044117
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题主示例代码中 testData 这个 RDD 的类型是已经确定为 RDD[(String, Int)],然后通过 RDD.rddToRDDPairFunctions 这个隐式类型转换转为 PairRDDFunctions[String, Int],从而获得 reduceByKey 和 combineByKey 这两个 methods。

然后来对比下二者的函数签名:

class PairRDDFunctions[K, V](...) {def reduceByKey(func: (V, V) => V): RDD[(K, V)]def combineByKey[C](createCombiner: V => C,mergeValue: (C, V) => C,mergeCombiners: (C, C) => C): RDD[(K, C)]
}

可以看到 reduceByKey 的 func 参数的类型只依赖于 PairRDDFunction 的类型参数 V,在这个例子里也就是 Int。于是 func 的类型已经确定为 (Int, Int) => Int,所以就不需要额外标识类型了。

而 combineByKey 比 reduceByKey 更加通用,它允许各个 partition 在 shuffle 前先做 local reduce 得到一个类型为 C 的中间值,待 shuffle 后再做合并得到各个 key 对应的 C。

以求均值为例,我们可以让每个 partiton 先求出单个 partition 内各个 key 对应的所有整数的和 sum 以及个数 count,然后返回一个 pair (sum, count)。在 shuffle 后累加各个 key 对应的所有 sum 和 count,再相除得到均值:

val sumCountPairs: RDD[(String, (Int, Long))] = testData.combineByKey((_: Int) => (0, 0L),(pair: (Int, Long), value: Int) =>(pair._1 + value, pair._2 + 1L),(pair1: (Int, Long), pair2: (Int, Long)) =>(pair1._1 + part2._1, pair2._2 + pair2._2)
)val averages: RDD[String, Double] = sumCountPairs.mapValues {case (sum, 0L) => 0Dcase (sum, count) => sum.toDouble / count
}

由于 C 这个 类型参数是任意的,并不能从 testData 的类型直接推导出来,所以必须明确指定。只不过题主的例子是最简单的用 reduceByKey 就可以搞定的情况,也就是 V 和 C 完全相同,于是就看不出区别了

请教Spark 中 combinebyKey 和 reduceByKey的传入函数参数的区别?相关推荐

  1. python CV2中shape和resize返回值和参数的区别

    python CV2中shape和resize返回值和参数的区别 1.在一副图像中使用shape得到一个3个类别的列表 shape[0] =图像的高 shape[1] =图像的宽 shape[2] = ...

  2. Spark中CheckPoint、Cache、Persist的用法、区别

    Spark中CheckPoint.Cache.Persist 大家好,我是一拳就能打爆A柱的猛男 这几天看到一套视频<尚硅谷2021迎新版大数据Spark从入门到精通>,其中有关于检查点( ...

  3. python中的以简单例子解释函数参数、函数定义、函数返回值、函数调用

    python-函数 1.函数定义 2.自定义函数,基本规则 3.语法 4.参数 4.1必备参数 4.2默认参数 4.3不定长参数 4.4匿名参数 5.函数举例代码 1.函数定义 函数是组织好的,可重复 ...

  4. java中3|4_关于java:函数参数中3个点的含义是什么?

    本问题已经有最佳答案,请猛点这里访问. 我在读Android文档中的AsyncTask. private class DownloadFilesTask extends AsyncTask { pro ...

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

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

  6. matlab 批量定义变量及批量传入函数参数

    光度立体涉及到多光源及其对应的多幅图像,在用matlab进行编程时,遇到批量定义变量和自定义函数的批量传入参数的问题.现总结如下,欢迎大家批评指正. 传统定义和传输方式 clc clear all c ...

  7. a commit git 参数是什么意思_Git中的git reset的三种参数的区别

    我们平时在使用git的时候,经常会遇到需要撤销上次操作的需求,这时候需要用到git reset的这个命令,他的使用就是 "git-reset – Reset current HEAD to ...

  8. Spark中mapToPair和flatMapToPair的区别【附示例源码及运行结果】

    本文重点介绍 Spark 中 [mapToPair]和[flatMapToPair]的区别,请继续看到尾部,后续有示例说明,会理解更加清晰. 函数原型 1.JavaPairRDD<K2,V2&g ...

  9. [JS]请填充代码,使mySort()能使传入的参数按照从小到大的顺序显示出来。

    请填充代码,使mySort()能使传入的参数按照从小到大的顺序显示出来. 刚开始刷js题真是不适应啊,这次体会到sort()的香了~ 请填充代码,使mySort()能使传入的参数按照从小到大的顺序显示 ...

  10. Spark基础学习笔记13:Scala函数

    文章目录 零.本讲学习目标 一.声明函数 (一)显式声明函数 1.声明格式 2.注意事项 3.案例演示 (1)加法函数 (2)阶乘函数 (二)隐式声明函数 1.声明格式 2.注意事项 3.案例演示 ( ...

最新文章

  1. enspar启动失败40_负债80万开始爆仓,快40岁的人了没钱创业,精神恍惚该怎么翻身?...
  2. linux中shell条件判断if中的-a到-z的意思
  3. 开发一个用户喜欢的ABAP接口日志程序
  4. android的窗口机制分析------事件处理
  5. TCP 的有限状态机
  6. 51nod1743-雪之国度【最小生成树,LCA,并查集】
  7. mysql提高吞吐量_垃圾收集:提高吞吐量
  8. Java Web学习总结(3)——Servlet详解
  9. Leanote使用mysql_搭建个人Leanote云笔记
  10. 非常好的Java反射例子
  11. UIWebView捕获内部web点击事件
  12. solr 5.0.0 bin/start脚本详细解析
  13. 二叉树中和为某一值的路径(三)(C++)
  14. Linux考试题(带答案)
  15. 软件体系结构风格整理
  16. 什么是IAST(交互式应用安全测试)?
  17. 【恩智浦杯(飞思卡尔)全国大学生智能汽车竞赛】解读部分北科技术报告图像处理内容(点到为止)
  18. cadence virtuoso画版图提示LUP.6错误
  19. 每日一题---摔手机
  20. surface android模拟,Surface Duo将支持Android小部件 模拟磁铁体验

热门文章

  1. code principles
  2. vue-admin自定义后台管理系统(二)之vue-cli3创建前端项目
  3. iOS开发: info访问权限配置
  4. 【编程技巧】——输入输出优化
  5. 二段式提交和三段式提交
  6. 黄光裕出来后,首先会做这三件事(转)
  7. Hosts Setup Utility – 在线更新 hosts
  8. jquery04-animate
  9. 水晶报表基础入门——6.交叉报表设计技术
  10. Lightroom Classic 教程,如何在 Lightroom 中使用边界变形保留完整视图?