combineByKey实例详解
项目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实例详解相关推荐
- java异常例子_java 异常的实例详解
java 异常的实例详解 1.异常的定义:程序在运行时出现不正常情况. 异常的划分: Error:严重的问题,对于error一般不编写针对性的代码对其进行处理. Exception:非严重的问题,对于 ...
- python 自动化办公 案例_python自动化工具之pywinauto实例详解
python自动化工具之pywinauto实例详解 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python自动化工具之pywinauto实例详解.txt ] (友情提示: ...
- java写exe程序实例,java实现可安装的exe程序实例详解
java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...
- python多进程应用场景_python使用多进程的实例详解
python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...
- php可以打印一个页面,利用html实现分页打印功能的实例详解
本篇介绍利用html实现分页打印功能的实例详解,有些不想打印出来的分页打印的都可以应用这类样式进行控制 在非打印时是无效的. 页面打印 /* 应用这个样式的在打印时隐藏 */ .noPrint { d ...
- python判断是否回文_对python判断是否回文数的实例详解
设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...
- python2.7除法_对python中的float除法和整除法的实例详解
从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...
- java测试类 main方法_Java使用agent实现main方法之前的实例详解
Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...
- java中匿名内部类详解_java 中匿名内部类的实例详解
搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...
- 【配置映射】—Entity Framework实例详解
前两篇博文中的配置属性和配置关系都是配置映射,配置属性是属性的映射,配置关系式关系的映射,本篇从讲讲实体的映射. 首先,配置实体映射到表,使用ToTable方法,它接受两个参数,第一个参数是表的名称, ...
最新文章
- explorer.exe应用程序错误说明 0X000000该内存不能为read的解决方法
- mysql超大数据库备份
- asp.net UrlRewrite 技术的实现
- C++map容器-大小和互换
- 又一家互联网咖啡品牌要凉:papi酱、李诞曾代言,融资4亿打水漂
- “Rule can only have one resource source”错误
- SSIS典型应用场景分析
- 06.【Axure 10 】Mac系统软件汉化
- 什么是计算机图形学?
- 推荐凸优化经典书籍,来自boyd
- python计算等额本金_等额本金还款计算公式
- activity关闭和dialog.dismiss冲突的解决(Activity has leaked window com.android.internal.p
- canvas教程6-绘制圆弧
- JAVA毕业设计-智慧农业水果销售系统计算机源码+lw文档+系统+调试部署+数据库
- ReThought (二): 如何照顾团队中的新人
- QQ聊天对话框内 聊天者昵称,发送者昵称 的字体颜色怎么设置
- win10无法安装提示磁盘布局不受UEFI固件支持的解决方法
- php json数据值,php操作JSON格式数据
- 网络安全之入侵检测系统
- 超级账本北京 MEET UP 在北京大学成功举办,这7位行业大咖究竟讲了啥?