项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

我们在做数据统计与分析的时候,经常会遇到K-V结构的数据,所以处理这种K-V结构的数据也是非常常见的需求。在Spark中,除了原生的RDD天然有这种K,V结构,API中也包含有javaPairRdd,PairwiseRdd等对应的接口。而对于KV结构的数据处理就有很多种情况了,例如像数据库的group by操作等。今天我们就来说说在spark中一个常用的操作:combineByKey

1.combineByKey函数原型

  /*** Simplified version of combineByKeyWithClassTag that hash-partitions the resulting RDD using the* existing partitioner/parallelism level. This method is here for backward compatibility. It* does not provide combiner classtag information to the shuffle.** @see [[combineByKeyWithClassTag]]*/def combineByKey[C](createCombiner: V => C,mergeValue: (C, V) => C,mergeCombiners: (C, C) => C): RDD[(K, C)] = self.withScope {combineByKeyWithClassTag(createCombiner, mergeValue, mergeCombiners)(null)}

可以看出,combineByKey是典型的K-V类型的算子,而且是一个transformation操作。与其他transformation操作一样,combineByKey也不会触发作业的提交。combineByKey函数主要有三个参数,而且这三个参数都是函数:
createCombiner: V => C 产生一个combiner的函数,将RDD[K,V]中的V转换成一个新的值C1
mergeValue: (C, V) => C 合并value的函数,将一个C1类型的值与一个V合并成一个新的C类型的值,假设这个新的C类型的值为C2
mergeCombiners: (C, C) => C) 将两个C类型的值合并为一个C类型的值

整个函数最后的输出为RDD[(K, C)]

2.看个实际例子

假设hdfs上有个文本,文本有两列:第一列为city城市名,第二列为用户标识uuid,现在想统计每个城市有多少UV并排序,用combineByKey就可以实现上述需求。源码如下:

    def t1(sc: SparkContext) = {val inputpath = "XXX"sc.textFile(inputpath).filter { x =>val lines = x.split("\t")lines.length == 2 && lines(1).length > 0}.map { x =>val lines = x.split("\t")val (city, uuid) = (lines(0), lines(1))(city, uuid)}.combineByKey((v: String) => {val set = new java.util.HashSet[String]()set.add(v)set},(x: java.util.HashSet[String], v: String) => {x.add(v)x},(x: java.util.HashSet[String], y: java.util.HashSet[String]) => {x.addAll(y)x}).map(x => (x._1, x._2.size())).sortBy(_._2, false).take(10).foreach(println)}

代码详解:
1.

(v: String) => {val set = new java.util.HashSet[String]()set.add(v)set

这个函数表示对于每一个city第一次出现的时候,先new一个hashset,并把此时的uuid加入到hashset中。

(x: java.util.HashSet[String], v: String) => {x.add(v)x}

这个表示将每一个uuid都merge到已有的combiner中。

 (x: java.util.HashSet[String], y: java.util.HashSet[String]) => {x.addAll(y)x}

最后一个函数表示将所有city对应的uuid的hashset合并,得到的就是每个city的所有uuid集合,达到了我们最终的目的!

combineByKey实例详解相关推荐

  1. java异常例子_java 异常的实例详解

    java 异常的实例详解 1.异常的定义:程序在运行时出现不正常情况. 异常的划分: Error:严重的问题,对于error一般不编写针对性的代码对其进行处理. Exception:非严重的问题,对于 ...

  2. python 自动化办公 案例_python自动化工具之pywinauto实例详解

    python自动化工具之pywinauto实例详解 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python自动化工具之pywinauto实例详解.txt ] (友情提示: ...

  3. java写exe程序实例,java实现可安装的exe程序实例详解

    java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...

  4. python多进程应用场景_python使用多进程的实例详解

    python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...

  5. php可以打印一个页面,利用html实现分页打印功能的实例详解

    本篇介绍利用html实现分页打印功能的实例详解,有些不想打印出来的分页打印的都可以应用这类样式进行控制 在非打印时是无效的. 页面打印 /* 应用这个样式的在打印时隐藏 */ .noPrint { d ...

  6. python判断是否回文_对python判断是否回文数的实例详解

    设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...

  7. python2.7除法_对python中的float除法和整除法的实例详解

    从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...

  8. java测试类 main方法_Java使用agent实现main方法之前的实例详解

    Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...

  9. java中匿名内部类详解_java 中匿名内部类的实例详解

    搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...

  10. 【配置映射】—Entity Framework实例详解

    前两篇博文中的配置属性和配置关系都是配置映射,配置属性是属性的映射,配置关系式关系的映射,本篇从讲讲实体的映射. 首先,配置实体映射到表,使用ToTable方法,它接受两个参数,第一个参数是表的名称, ...

最新文章

  1. explorer.exe应用程序错误说明 0X000000该内存不能为read的解决方法
  2. mysql超大数据库备份
  3. asp.net UrlRewrite 技术的实现
  4. C++map容器-大小和互换
  5. 又一家互联网咖啡品牌要凉:papi酱、李诞曾代言,融资4亿打水漂
  6. “Rule can only have one resource source”错误
  7. SSIS典型应用场景分析
  8. 06.【Axure 10 】Mac系统软件汉化
  9. 什么是计算机图形学?
  10. 推荐凸优化经典书籍,来自boyd
  11. python计算等额本金_等额本金还款计算公式
  12. activity关闭和dialog.dismiss冲突的解决(Activity has leaked window com.android.internal.p
  13. canvas教程6-绘制圆弧
  14. JAVA毕业设计-智慧农业水果销售系统计算机源码+lw文档+系统+调试部署+数据库
  15. ReThought (二): 如何照顾团队中的新人
  16. QQ聊天对话框内 聊天者昵称,发送者昵称 的字体颜色怎么设置
  17. win10无法安装提示磁盘布局不受UEFI固件支持的解决方法
  18. php json数据值,php操作JSON格式数据
  19. 网络安全之入侵检测系统
  20. 超级账本北京 MEET UP 在北京大学成功举办,这7位行业大咖究竟讲了啥?

热门文章

  1. Nagios客户端的安装步骤(要监控的服务器)
  2. ColorTransform类应用实例:鼠标经过时使图片发光。
  3. tomcat处理连接的详细过程
  4. 企业在信息化建设上乘之选:软件快速开发框架
  5. 深入浅出分布式系统Raft协议
  6. EXT.NET GridPanel默认选中多行
  7. 数据结构与算法JavaScript描述——队列
  8. BZOJ1001: [BeiJing2006]狼抓兔子 (最小割)
  9. GoldenGate新增表
  10. Java连接各种数据库