请教Spark 中 combinebyKey 和 reduceByKey的传入函数参数的区别?
来源:互联网 发布:陕西师大远程网络教育 编辑:程序博客网 时间:2024/06/05 22:51
请教Spark 中 combinebyKey 和 reduceByKey的传入函数参数的区别?
作者:连城
链接:https://www.zhihu.com/question/45420080/answer/99044117
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
由于 C 这个 类型参数是任意的,并不能从 testData 的类型直接推导出来,所以必须明确指定。只不过题主的例子是最简单的用 reduceByKey 就可以搞定的情况,也就是 V 和 C 完全相同,于是就看不出区别了
链接: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) => 0D case (sum, count) => sum.toDouble / count}
0 0
- 请教Spark 中 combinebyKey 和 reduceByKey的传入函数参数的区别?
- Spark RDD中Transformation的combineByKey、reduceByKey,join详解
- Spark编程的基本的算子之:combineByKey,reduceByKey,groupByKey
- 第148讲:Spark RDD中Transformation的combineByKey、reduceByKey详解
- mabatis中${}和#{}传入参数的区别
- Spark中groupByKey与reduceByKey算子之间的区别
- [Spark--基础]--聚合操作-reduceByKey、combineBykey、groupBy和AggregateByKey
- groupByKey 和reduceByKey 的区别:
- Learning Spark 笔记(四) -- reduceByKey、combineByKey
- 【转载】Spark中:reduceByKey和groupByKey区别与用法
- [Spark--PairRDDFunctions]--combineByKey的解释
- mybatis的传入参数#和$的区别
- spark reduceByKey的小问题
- js函数中传入的event参数
- 通过 “由对象V到对象C的转换” 来说明 Spark_Streaming api中 reduceByKey 与 combineByKey 注意事项
- 函数的传入和传出参数
- Spark函数讲解:combineByKey
- 结合Spark源码分析, combineByKey, aggregateByKey, foldByKey, reduceByKey
- AJAX 下拉无刷新分页加载
- 10分钟了解Delphi XE全平台开发流程
- [每日问答]正负样本不平衡应该怎么处理?
- apache 安装与配置
- 2017中国餐饮报告部分
- 请教Spark 中 combinebyKey 和 reduceByKey的传入函数参数的区别?
- 5-11
- Operators in MXNet-Convolution
- 一天一个算法: 前缀,中缀,后缀表达式的转换
- 【转载】Android开发错误:Error:” ” is not translated in “en” (English) [MissingTranslation]如何处理?
- git push之后删除node_modules
- iOS相机相册调用 — UIImagePickerController
- openwrt最专业的网站
- Android利用极光推送获取到消息并缓存至本地