scala combineByKey用法说明
语法是:
combineByKey[C](
createCombiner: V => C,
mergeValue: (C, V) => C,
mergeCombiners: (C, C) => C
)
标记一下:(因为有很多同样的字母,方便说明我就按照字母+数字标记一下)

语法说明:(不复制网上的,我按照我的理解大白话说明)
1,combineByKey 中的byKey 就是按照键来处理,你就默认 他丫知道 哪些键是一样的,他会在每个分区自动归类同样的键,你就操心怎么处理值就行了, 总之就是:对相同K,把V合并成一个集合
2,每条数据会被遍历,如果某条数据的键 是第一遇到,就用createCombiner 处理,否则用mergeValue (你要是第一次去银行存钱,流程就是先开户, 下一次去了你存钱就是其他的流程了->直接存钱就行)
3,createCombiner 和 mergeValue 处理单个分区中数据, mergeCombiners是每个分区处理完了 合并数据使用
例子说明:Fred 和 william 二个人  数语外分数 分别是 val scores = Array(("Fred", 88), ("Fred", 95), ("Fred", 91), ("Wilma", 93), ("Wilma", 95), ("Wilma", 98))
求他们各自的平均成绩
思路是: 通过combineByKey函数把按照人分组 求出 他们的总分 和科目数 ,然后用map函数 除一下就完事
操作1:为了模拟多个分区 我创建2个分区
  
  
操作2: 把每个分区的结果按照名字 计算分数总和 科目数量

说明:参照语法图
(左图) (右图)


首先:各个分区的兄弟们先干活
    第一个分区遍历开始: 数据为
--> 处理(Fred,88), 因为是第一次遇到键“Fred”, 所以调用createCombiner方法 (v)=> (v,1) ; 这里就是(88) => (88,1)
        --> 处理(Fred,95),不是第一次遇到键“Fred”,调用mergeValue方法(acc:(Int,Int),v)=>(acc._1+v,acc._2+1),: 这里就是((88,1),95)=>(88+95, 1+1)
        --> 处理(Fred,91),不是第一次遇到键“Fred”,调用mergeValue方法(acc:(Int,Int),v)=>(acc._1+v,acc._2+1),: 这里就是((88+95,1+1),91)=>(88+95+91, 1+1+1)
第一个分区遍历结束:返回(274,3) (注意一个分区中可能有很多不一样的键值对,我这里碰巧只有fred一个人 ,也许还有张三(**,**), 李四(**,**))(程序本来就按照键BYkeys分组了,所以不用担心混淆了键)
   第二个分区遍历开始: 数据为:
--> 处理(Wilma,93), 因为是第一次遇到键“Fred”, 所以调用createCombiner方法 (v)=> (v,1) ; 这里就是(93) => (93,1)
        --> 处理(Wilma,95),不是第一次遇到键“Fred”,调用mergeValue方法(acc:(Int,Int),v)=>(acc._1+v,acc._2+1),: 这里就是((93,1),95)=>(93+95, 1+1)
        --> 处理(Wilma,98),不是第一次遇到键“Fred”,调用mergeValue方法(acc:(Int,Int),v)=>(acc._1+v,acc._2+1),: 这里就是((93+95,1+1),98)=>(93+95+98, 1+1+1)
第一个分区遍历结束:返回(286,3)
然后:各个分区兄弟干完了 汇总处理
由于我的数据少,没有模拟到比如分区 1 和分区2 都有 Fred的成绩, 他三科成绩在第一个分区就全部统计到了。
假如 分区一返回的是fred信息(274,3),
分区二返回是 fred的体育成绩(80,1), 和wilma的三科成绩(286,3)
汇总后开始调用mergeCombiners: (C, C) => C 方法
         (acc1:(Int,Int),acc2:(Int,Int))=>(acc1._1+acc2._1,acc1._2+acc2._2)) 执行到就应该是  ((274,3),(80,1)) =>(274+80 , 3+1)     (fred的结果)
。。。。。。。。。。。。=>(286,3) (WILMA的结果)
操作3: 把分数总和 和 科目数量除一下 得到平均成绩


scala combineByKey用法说明的更多相关文章
- Scala中“=>”用法及含义
		=> has several meanings in Scala, all related to its mathematical meaning as implication. 1. In a ... 
- Scala List 用法
		1.++[B] 在A元素后面追加B元素 scala> val a = List(1) a: List[Int] = List(1) scala> val b = List(2) b: ... 
- scala函数用法
		直接上代码. package com.test.scala.test object Function { def main(args: Array[String]): Unit = { println ... 
- 【Spark算子】:reduceByKey、groupByKey和combineByKey
		在spark中,reduceByKey.groupByKey和combineByKey这三种算子用的较多,结合使用过程中的体会简单总结: 我的代码实践:https://github.com/wwcom ... 
- Chisel语言
		1 What is Chisel? Chisel(Constructing Hardware In a Scala Embedded Language)是一种嵌入在高级编程语言Scala的硬 ... 
- scala占位符_的用法
		占位符的用途颇多,先介绍几种常用的用法 1.作为"通配符",类似Java中的*.如import scala.math._2.:_*作为一个整体,告诉编译器你希望将某个参数当作参数序 ... 
- spark中的combineByKey函数的用法
		一.函数的源码 /** * Simplified version of combineByKeyWithClassTag that hash-partitions the resulting RDD ... 
- Scala进阶之路-Scala中的枚举用法案例展示
		Scala进阶之路-Scala中的枚举用法案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的枚举值和Java中的枚举值有点差别,不过使用起来也都差大同小异,我这 ... 
- Scala入门4(_的用法)
		从网上找了一篇博客,详细讲解了Scala下划线的用法,这里做保留 博客链接 
随机推荐
- HDU 2719 The Seven Percent Solution (水题。。。)
			题意:把字符串中的一些特殊符号用给定的字符串代替. 析:没的说. 代码如下: #include <iostream> #include <cstdio> #include &l ... 
- ( KMP  求循环节的个数)Power Strings -- poj -- 2406
			链接: http://poj.org/problem?id=2406 Power Strings Time Limit:3000MS Memory Limit:65536KB 64bi ... 
- hdu 2048 神上帝以及老天爷
			题目 解题思路: 典型的错排题目 首先求出所有的拿错的情况,然后求出错排的所有情况,以前者除以后者就是百分比 现在求对应的所有都拿错的情况.容易知道,f(1)=0,f(2 ... 
- hdu 5038 求出现次数最多的grade
			http://acm.hdu.edu.cn/showproblem.php?pid=5038 模拟水题 求出现次数最多的grade.如果有多个grade出现的次数一样多,且还有其他的grade,则把这 ... 
- Django开发Web监控工具-pyDash
			今天发现了一个比较有意思的监控工具,是基于Django开发的,开发大牛已经开放了源代码,向大牛致敬,同时研究研究,目前感觉这个监控比较直观,可以针对个人服务器使用,同时涉及的环境比较简单,部署起来 ... 
- LeetCode145:Binary Tree Postorder Traversal
			题目: Given a binary tree, return the postorder traversal of its nodes' values. For example: Given bin ... 
- python 删除一个目录下的所有文件
			一个目录下有文件,文件夹,文件夹里又有文件.文件夹....用python脚本,实现,递归删除一个目录下的所有文件: 目录结构如下: 其中我们要删除所有文件 代码实现如下: import os CUR_ ... 
- sqlserver错误2,error 40
			打开配置管理器:开始-> sqlserver2014->配置工具->配置管理器 选择sqlserver服务,并将右侧箭头的指向右击设为启动就OK了 
- C# 读取Excel,一波华丽的操作
			C# 读取Excel,其实有很多方法.但是今天要来一波华丽的操作. 先看效果: 以上这波操作使用了 ExcelDataReader 和 ExcelDataReader.DataSet 完成的. Exc ... 
- c#快速导出到Excel
			导出到Excel,基本是很多单据的标配功能了.笔者之前将Datagridview的数据导出到Excel时,将数据一个单元格一个单元格的写入,效率奇慢, 1030条数据花费了将近70s的时间.后来借鉴了 ... 
