语法是:

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用法说明的更多相关文章

  1. Scala中“=>”用法及含义

    => has several meanings in Scala, all related to its mathematical meaning as implication. 1. In a ...

  2. Scala List 用法

    1.++[B]   在A元素后面追加B元素 scala> val a = List(1) a: List[Int] = List(1) scala> val b = List(2) b: ...

  3. scala函数用法

    直接上代码. package com.test.scala.test object Function { def main(args: Array[String]): Unit = { println ...

  4. 【Spark算子】:reduceByKey、groupByKey和combineByKey

    在spark中,reduceByKey.groupByKey和combineByKey这三种算子用的较多,结合使用过程中的体会简单总结: 我的代码实践:https://github.com/wwcom ...

  5. Chisel语言

    1 What is Chisel?      Chisel(Constructing Hardware In a Scala Embedded Language)是一种嵌入在高级编程语言Scala的硬 ...

  6. scala占位符_的用法

    占位符的用途颇多,先介绍几种常用的用法 1.作为"通配符",类似Java中的*.如import scala.math._2.:_*作为一个整体,告诉编译器你希望将某个参数当作参数序 ...

  7. spark中的combineByKey函数的用法

    一.函数的源码 /** * Simplified version of combineByKeyWithClassTag that hash-partitions the resulting RDD ...

  8. Scala进阶之路-Scala中的枚举用法案例展示

    Scala进阶之路-Scala中的枚举用法案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的枚举值和Java中的枚举值有点差别,不过使用起来也都差大同小异,我这 ...

  9. Scala入门4(_的用法)

    从网上找了一篇博客,详细讲解了Scala下划线的用法,这里做保留 博客链接

随机推荐

  1. Python之Pandas中Series、DataFrame

    Python之Pandas中Series.DataFrame实践 1. pandas的数据结构Series 1.1 Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一 ...

  2. IP之ALTDDIO_in仿真

    需要添加altera_mf库,才可以仿真. 上升沿输出,把前一个时钟的数据输出来. `timescale 1 ns/ 1 ns; module altddio_in_ip_tb; reg rst; r ...

  3. Mouse Touch Stylus

    Mouse操作: preview mouse down, StylusDevice:null mouse down,StylusDevice:null preview mouse up, Stylus ...

  4. Shell编程-07-Shell中的case语句

    目录 基本语法 case示例 case语句总结     case语句相当于多分支的if/elif/else语句,而在使用case会让脚本看起来更简单工整.在case语句中,程序会将获取到的值与case ...

  5. (网络流 匹配 KM) Going Home --poj -- 2195

    链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#problem/D 有n个人有n栋房子,每栋房子里能进一个人,但每走一格 ...

  6. Asp.net mvc验证用户登录之Forms实现

    这里我们采用asp.net mvc 自带的AuthorizeAttribute过滤器验证用户的身份,也可以使用自定义过滤器,步骤都是一样. 第一步:创建asp.net mvc项目, 在项目的App_S ...

  7. 关闭父类弹出的ifream窗口

    parent.document.getElementById('zhuce').style.display = 'none';

  8. codevs 1012

    题目描述 Description 给出n和n个整数,希望你从小到大给他们排序 输入描述 Input Description 第一行一个正整数n 第二行n个用空格隔开的整数 输出描述 Output De ...

  9. Mongodb 存储日志信息

    线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息,通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题,但当产生大量的日志之后,要想从大量日志里挖 ...

  10. Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)

    Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...