Spark RDD操作:combineByKey函数详解
来源:互联网 发布:化妆品销售数据分析 编辑:程序博客网 时间:2024/06/05 15:22
当数据集一键值对形式组织的时候,聚合具有相同键的元素进行一些统计是很常见的操作。对于Pair RDD常见的聚合操作如:reduceByKey,foldByKey,groupByKey,combineByKey。这里重点要说的是combineByKey。因为combineByKey是Spark中一个比较核心的高级函数,groupByKey,reduceByKey都是基于combineByKey实现的。
combineByKey的定义
def combineByKey[C]( createCombiner: V => C, mergeValue: (C, V) => C, mergeCombiners: (C, C) => C, partitioner: Partitioner, mapSideCombine: Boolean = true, serializer: Serializer = null)
其中的参数:
createCombiner: V => C ,这个函数把当前的值作为参数,此时我们可以对其做些附加操作(类型转换)并把它返回 (这一步类似于初始化操作)
mergeValue: (C, V) => C,该函数把元素V合并到之前的元素C(createCombiner)上 (这个操作在每个分区内进行)
mergeCombiners: (C, C) => C,该函数把2个元素C合并 (这个操作在不同分区间进行)
numPartitions:结果RDD分区数,默认保持原有的分区数partitioner:分区函数,默认为HashPartitioner
mapSideCombine:是否需要在Map端进行combine操作,类似于MapReduce中的combine,默认为true
combineByKey来求解平均数的例子
val initialScores = Array(("Fred", 88.0), ("Fred", 95.0), ("Fred", 91.0), ("Wilma", 93.0), ("Wilma", 95.0), ("Wilma", 98.0)) val d1 = sc.parallelize(initialScores) type MVType = (Int, Double) //定义一个元组类型(科目计数器,分数) d1.combineByKey( score => (1, score), (c1: MVType, newScore) => (c1._1 + 1, c1._2 + newScore), (c1: MVType, c2: MVType) => (c1._1 + c2._1, c1._2 + c2._2) ).map { case (name, (num, socre)) => (name, socre / num) }.collect参数含义的解释
a 、score => (1, score),我们把分数作为参数,并返回了附加的元组类型。 以"Fred"为列,当前其分数为88.0 =>(1,88.0) 1表示当前科目的计数器,此时只有一个科目
b、(c1: MVType, newScore) => (c1._1 + 1, c1._2 + newScore),注意这里的c1就是createCombiner初始化得到的(1,88.0)。在一个分区内,我们又碰到了"Fred"的一个新的分数91.0。当然我们要把之前的科目分数和当前的分数加起来即c1._2 + newScore,然后把科目计算器加1即c1._1 + 1
c、 (c1: MVType, c2: MVType) => (c1._1 + c2._1, c1._2 + c2._2),注意"Fred"可能是个学霸,他选修的科目可能过多而分散在不同的分区中。所有的分区都进行mergeValue后,接下来就是对分区间进行合并了,分区间科目数和科目数相加分数和分数相加就得到了总分和总科目数
0 0
- Spark RDD操作:combineByKey函数详解
- Spark核心RDD:combineByKey函数详解
- Spark核心RDD:combineByKey函数详解
- Spark核心RDD:combineByKey函数详解
- Spark核心RDD:combineByKey函数详解
- Spark核心RDD:combineByKey函数详解
- Spark核心RDD:combineByKey函数详解
- Spark算子:RDD键值转换操作(2)–combineByKey、foldByKey
- Spark算子:RDD键值转换操作(2)–combineByKey、foldByKey
- Spark算子:RDD键值转换操作(2)–combineByKey、foldByKey
- Spark算子:RDD键值转换操作(2)–combineByKey、foldByKey
- 3.3 Spark RDD 键值转换操作2-combineByKey、foldByKey
- Spark RDD中Transformation的combineByKey、reduceByKey,join详解
- Spark RDD算子【三】combineByKey
- Spark-聚合操作-combineByKey
- spark 算子combineByKey 详解
- Spark函数讲解:combineByKey
- Spark RDD操作函数说明
- 动态代理之详细DEBUG日志模式
- DataPump Import (IMPDP) Fails With Error ORA-39083 Object Type INDEX_STATISTICS (文档 ID 1454880.1)
- 【OpenCV3】图像旋转与平移——cv::warpAffine()详解
- 倒计时的实现
- leetcode 1 Two Sum
- Spark RDD操作:combineByKey函数详解
- 【优雅编程之道】之提升SQL性能的8点整理和建议
- Retrofit使用教程(二)
- 防火墙漏洞
- xmlspy学习之如何写仅含文本复合元素
- 润乾报表autobig标签展现、打印、导出问题总结
- oracle 数据类型
- 高斯消元
- android 多媒体和相机详解八