项目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)))

简单分析一下上面的代码逻辑:
mapValuesPairRDDFunctions中的方法,顾名思义,是对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聚合求平均值与占比相关推荐

  1. Spark入门(十三)之分组求平均值

    一.分组求平均值 计算文本里面的每个key分组求平均值,输出结果. 二.maven设置 <?xml version="1.0" encoding="UTF-8&qu ...

  2. 新手向,从用Spark求平均值到reduceByKey详解

    1.前因后果 在网上看到了一种用Spark求平均值的算法,自己写了下,修改了一些错误,我这是能直接run起来的版本.我会在本文中对这段代码进行详细的讲解,以加强对reduceByKey用法的印象.耐心 ...

  3. Python groupby 分组 再求平均值 求和 agg聚合 transform不改变形状应用函数

    一. groupby 依据某列分组: groupby 依据多列分组: 二.应用 mean sum count std median size max min等函数聚合数据: 三.transform 不 ...

  4. Hadoop入门(二十二)Mapreduce的求平均值程序

    一.简介 求平均值是统计中最常使用到的,现在使用Mapreduce在海量数据中统计数据的求平均值. 二.例子 (1)实例描述 给出三个文件,每个文件中都存储了若干个数值,求所有数值中的求平均值. 样例 ...

  5. C# Linq to Entity Lamda方式分组并求和求平均值

    1.单字段分组并求和: var list = data.GroupBy(g => g.GoodsId).Select(e => new { GoodsId = e.Key, Qty = e ...

  6. (篇十)用结构体数组处理学生成绩、结构体类型函数求平均值

    文章目录 一.结构体变量 二.用结构体数组处理学生成绩 三.结构体类型函数求平均值 用C语言学好结构化编程逻辑!本篇主要分析结构体数组和结构体类型的函数,对于二级C语言来说,主要是考处理学生多个成绩上 ...

  7. EXCEL表格-按条件求和、求平均值、求个数详解

    ❤关注我,不迷路❤ 点击进入EXCEL综合应用场景专栏 生活中经常会遇到按条件求和.按条件求平均值的场景,比如统计某个班级中成绩在60分以上的男生的个数,本文将以递进的形式进行对多种场景从易至难讲解, ...

  8. 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符...

    目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk  print 交给bash awk中运行shell命 ...

  9. PTA 1054 求平均值 (c++ 代码+分析)

    1054 求平均值 (20 分) 分析:这个题乍一看并不难,但是丢分的点还是挺多的. 1.要注意只有一个小数点 2.小数点不能放在首位,而且首位是负号的话不能只有这一位. 3.每位只能是数字,且小数点 ...

  10. spark业务开发-聚合(agg)

    spark业务开发-聚合(agg) 项目地址:https://gitee.com/cch-bigdata/spark-process.git 输入数据 name,profession,enroll,s ...

最新文章

  1. NIPS 2017录用论文先睹为快!论文作者清华专场分享(附PPT下载)
  2. mysql 5.6 proxy_mysql-5.6+mysql-proxy构建主从复制与读写分离
  3. win10系统使用Anaconda安装opencv(python)
  4. 第五十四期:MongoDB与MySQL:如何选择
  5. python中str表示什么意思_python的str是什么类型
  6. 鼠标双击检测_雷蛇巴塞利斯蛇无线游戏鼠标评测:青出于蓝胜于蓝
  7. msbuild.exe编译c#项目
  8. Winform读报工具
  9. 用例规约要细致到万无一失吗?
  10. BZOJ 3190: [JLOI2013]赛车
  11. 每天1万步就叫健康吗?
  12. smarty缓存控制
  13. 1000道Python题库系列分享三(30道)
  14. matlab聚类实验,实验3Matlab聚类分析
  15. 蝉妈妈对话曹颖:5月带货1.1亿,踩过的坑都变成了卖货的筹码
  16. Oracle 错误疑难解决方案和总结
  17. 从键盘输入十个整数,统计非负数的个数,计算非负数的和
  18. 谁说大专生不能够学好Java呢?照着这个路线走,高中生都可以!
  19. 大恒halcon 深度学习公开课
  20. 【苹果相册推】怎么操作呢?是什么意思?

热门文章

  1. 《Asp.Net 2.0 揭秘记(十四)
  2. keepalived基本应用解析
  3. 那些年,我玩过的操作系统
  4. 代码之美~Func让构造方法为属性赋值更灵活
  5. 关于Google Instant 你必须知道的6件事情,互联网营销
  6. 加载本地文件为String类型
  7. idea断点调试继续执行快捷键(keymap设置了eclipse)
  8. MapXtreme2004鹰眼程序
  9. ocs边缘服务器部署规划简要说明
  10. 常见的反爬虫和应对方法 (转)