Spark 按key聚合求平均值与占比
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步
1.求key的平均值
k,v结构的数据中,求每个key对应的平均值,在spark中怎么应该怎么求?
例如有如下的数据:
("a",10)
("b",4)
("a",10)
("b",20)
想求a,b对应的平均值。
直接上代码
sc.parallelize(List(("a",10),("b",4),("a",10),("b",20))).mapValues(x => (x, 1)).reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2)).mapValues(x => (x._1, x._2, x._1.toDouble / x._2.toDouble)).collect()
在spark-shell中运行上述的代码以后,输出如下:
Array[(String, (Int, Int, Double))] = Array((a,(20,2,10.0)), (b,(24,2,12.0)))
简单分析一下上面的代码逻辑:
mapValues
是PairRDDFunctions
中的方法,顾名思义,是对kv结构的rdd的value进行map的操作。
然后进行reduceByKey
操作,此时将value中的值累加,对应出现的次数也累加。
最后再调用mapValues
方法,求每个key的平均值即可。
2.求key对应的value值的占比
同样是上面的数据,我们想求a,b对应的value值分别占比是多少,该怎么计算?
val array = sc.parallelize(List(("a",10),("b",4),("a",10),("b",20))).reduceByKey(_ + _).collect()
val sum = array.foldLeft(0)({ (z, f) => z + f._2 })
array.map(x => println("%s\t%s\t%s".format(x._1, x._2, x._2.toDouble / sum)))
在spark-shell中运行上述的代码以后,输出如下:
a 20 0.45454545454545453
b 24 0.5454545454545454
上面代码的逻辑如下:
1.先用reduceByKey
根据key聚合。
2.用foldLeft
方法算出所有key的总和。
3.对包含所有key的数组进行遍历,得到各个key的占比。
3.foldLeft的简单讲解
上面用到了foldLeft
函数。从本质上来讲,fold函数是将一种格式的输入数据转化为另外一种格式返回。
foldLeft
的原型如下:
override /*TraversableLike*/def foldLeft[B](z: B)(op: (B, A) => B): B =foldl(0, length, z, op)
foldLeft
有两个输入参数:初始值以及一个函数。而这个函数也包含有两个输入参数:累加值z与TraversableLike
的当前item。
foldLeft
方法开始运行以后,步骤如下:
1.初始值0作为第一个参数传入foldLeft,array中的第一个item作为第二个参数f传入foldLeft中。
2.foldLeft对两个参数进行计算,上面的例子是将参数相加并返回。
3.foldLeft将上一步返回的值作为输入函数的第一个参数,并且把array的下面一个item作为第二个参数传入继续计算。
4.重复上面的步骤,直到遍历完array中的所有item。
Spark 按key聚合求平均值与占比相关推荐
- Spark入门(十三)之分组求平均值
一.分组求平均值 计算文本里面的每个key分组求平均值,输出结果. 二.maven设置 <?xml version="1.0" encoding="UTF-8&qu ...
- 新手向,从用Spark求平均值到reduceByKey详解
1.前因后果 在网上看到了一种用Spark求平均值的算法,自己写了下,修改了一些错误,我这是能直接run起来的版本.我会在本文中对这段代码进行详细的讲解,以加强对reduceByKey用法的印象.耐心 ...
- Python groupby 分组 再求平均值 求和 agg聚合 transform不改变形状应用函数
一. groupby 依据某列分组: groupby 依据多列分组: 二.应用 mean sum count std median size max min等函数聚合数据: 三.transform 不 ...
- Hadoop入门(二十二)Mapreduce的求平均值程序
一.简介 求平均值是统计中最常使用到的,现在使用Mapreduce在海量数据中统计数据的求平均值. 二.例子 (1)实例描述 给出三个文件,每个文件中都存储了若干个数值,求所有数值中的求平均值. 样例 ...
- C# Linq to Entity Lamda方式分组并求和求平均值
1.单字段分组并求和: var list = data.GroupBy(g => g.GoodsId).Select(e => new { GoodsId = e.Key, Qty = e ...
- (篇十)用结构体数组处理学生成绩、结构体类型函数求平均值
文章目录 一.结构体变量 二.用结构体数组处理学生成绩 三.结构体类型函数求平均值 用C语言学好结构化编程逻辑!本篇主要分析结构体数组和结构体类型的函数,对于二级C语言来说,主要是考处理学生多个成绩上 ...
- EXCEL表格-按条件求和、求平均值、求个数详解
❤关注我,不迷路❤ 点击进入EXCEL综合应用场景专栏 生活中经常会遇到按条件求和.按条件求平均值的场景,比如统计某个班级中成绩在60分以上的男生的个数,本文将以递进的形式进行对多种场景从易至难讲解, ...
- 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符...
目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk print 交给bash awk中运行shell命 ...
- PTA 1054 求平均值 (c++ 代码+分析)
1054 求平均值 (20 分) 分析:这个题乍一看并不难,但是丢分的点还是挺多的. 1.要注意只有一个小数点 2.小数点不能放在首位,而且首位是负号的话不能只有这一位. 3.每位只能是数字,且小数点 ...
- spark业务开发-聚合(agg)
spark业务开发-聚合(agg) 项目地址:https://gitee.com/cch-bigdata/spark-process.git 输入数据 name,profession,enroll,s ...
最新文章
- NIPS 2017录用论文先睹为快!论文作者清华专场分享(附PPT下载)
- mysql 5.6 proxy_mysql-5.6+mysql-proxy构建主从复制与读写分离
- win10系统使用Anaconda安装opencv(python)
- 第五十四期:MongoDB与MySQL:如何选择
- python中str表示什么意思_python的str是什么类型
- 鼠标双击检测_雷蛇巴塞利斯蛇无线游戏鼠标评测:青出于蓝胜于蓝
- msbuild.exe编译c#项目
- Winform读报工具
- 用例规约要细致到万无一失吗?
- BZOJ 3190: [JLOI2013]赛车
- 每天1万步就叫健康吗?
- smarty缓存控制
- 1000道Python题库系列分享三(30道)
- matlab聚类实验,实验3Matlab聚类分析
- 蝉妈妈对话曹颖:5月带货1.1亿,踩过的坑都变成了卖货的筹码
- Oracle 错误疑难解决方案和总结
- 从键盘输入十个整数,统计非负数的个数,计算非负数的和
- 谁说大专生不能够学好Java呢?照着这个路线走,高中生都可以!
- 大恒halcon 深度学习公开课
- 【苹果相册推】怎么操作呢?是什么意思?