语法是:

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. JAVA开发常用计算机命令

    系统常用命令 win+r > control (可进入控制面板,管理工具,服务) win+r > cmd > systeminfo (x86-based 指32位系统,x86-64 ...

  2. Windows环境下的安装gcc

    Windows具有良好的界面和丰富的工具,所以目前linux开发的流程是,windows下完成编码工作,linux上实现编译工作. 为了提高工作效率,有必要在windows环境下搭建一套gcc,gdb ...

  3. day01(静态、代码块、类变量和实类变量辨析 )

    静态: 关键字:static          概述: 使用static关键字修饰的成员方法.成员变量称为静态成员方法.静态成员变量.    优缺点:   优点:使用时不用创建对象,节约了空间.使得代 ...

  4. Bitcoin

    看李笑来老师的2013演讲——Bitcoin is not virtual currency,it is a real world. 1.由于bitcoin的算法中进行有上限量的发布,所以这是不会出现 ...

  5. Visual Studio模板

    转载自MSDN,此文仅作参考. http://msdn.microsoft.com/zh-cn/library/6db0hwky(VS.80).aspx 1. 如何导入“项目模板(Project Te ...

  6. CentOS系统安装遇到的一些问题

    Vi操作:按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi:w file 将修改另外保存到file中,不退出vi:w! 强制保存,不推出vi:wq 保存文件并退出vi:wq! 强制保存文件 ...

  7. NET 文件批量下载

    HTML <a class="btn btn-warning" id="btnDownload">选中下载</a> JS /* 批量下载 ...

  8. CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)

    目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...

  9. UWP开发入门(九)——简单界面的布局技巧及屏幕适应

    嘿嘿嘿,题目比较绕哈.本篇主要讨论一般情况下,页面的布局技巧,怎么将元素的展现尽量做到分辨率无关.基本的思路仍然是尽量少的标定具体的数字,而是用比列来标注各元素占据的空间. 这里我打算用易信的名片页来 ...

  10. pageadmin CMS网站建设教程:模板中如何实现信息数据共享

    pageadmin CMS网站制作教程:模板中如何实现信息数据共享 很多时候信息数据需要共享,一个最常用的应用场景就是手机版(独立手机,非响应式)本共享pc版本数据,下面以这个场景为例讲解. 假设手机 ...