spark 应用场景2-身高统计

原文引自:http://blog.csdn.net/fengzhimohan/article/details/78564610

a. 案例描述

本案例假设我们需要对某个省的人口 (10万) 性别还有身高进行统计,需要计算出男女人数,男性中的最高和最低身高,以及女性中的最高和最低身高。本案例中用到的源文件有以下格式, 三列分别是 ID,性别,身高 (cm),格式如下: 

b.人口数据的生成

利用Java语言随机生成一组人口数据,包括序列ID,性别M/F,身高cm,代码如下:

 1 import java.io.File;
 2 import java.io.FileWriter;
 3 import java.io.IOException;
 4 import java.util.Random;
 5 
 6 /**
 7  * Created by Administrator on 2017/11/13.
 8  */
 9 public class PeopleInfoFileGenerator {
10     public static void main(String[] args){
11         File file = new File("F:\\PeopleInfo.txt");
12 
13         try {
14             Random random = new Random();//生成随机数
15             FileWriter fileWriter = new FileWriter(file);//新建一个文件
16             for (int i=1;i<=1000000;i++){   //生成10万个数字
17                 int height = random.nextInt(220); 
18                 if (height < 50) {
19                     height = height + 50;
20                 }
21              String  gender = getRandomGender(); //性别方法
22              if (height < 100 && gender == "M") {
23                  height = height + 100;
24              }
25               if (height < 100 && gender == "F") {
26                   height = height + 40;
27               }
28              fileWriter.write( i + " " + getRandomGender() + " " + height); //文件格式:ID 性别 身高
29              fileWriter.write(System.getProperty("line.separator"));
30             }
31             fileWriter.flush();
32             fileWriter.close();
33             System.out.println("People Information File generated successfully.");
34         }catch (IOException e){
35             e.printStackTrace();
36         }
37     }
38 
39     public static String getRandomGender(){ //构建一个随机生成性别方法
40         Random random = new Random();
41         int randomNum = random.nextInt(2) + 1;
42         if( randomNum % 2 == 0){
43             return "M";
44         }else{
45             return "F";
46         }
47     }
48 }

c. 实例过程分析

对于这个案例,我们要分别统计男女的信息,那么很自然的想到首先需要对于男女信息从源文件的对应的 RDD 中进行分离,这样会产生两个新的 RDD,分别包含男女信息;其次是分别对男女信息对应的 RDD 的数据进行进一步映射,使其只包含身高数据,这样我们又得到两个 RDD,分别对应男性身高和女性身高;最后需要对这两个 RDD 进行排序,进而得到最高和最低的男性或女性身高。 
第一步,先分离男女信息,使用 filter 算子过滤条件包含”M” 的行是男性,包含”F”的行是女性;第二步我们需要使用 map 算子把男女各自的身高数据从 RDD 中分离出来;第三步我们需要使用 sortBy 算子对男女身高数据进行排序。

特别注意:RDD 转化的过程中需要把身高数据转换成整数,否则 sortBy 算子会把它视为字符串,那么排序结果就会受到影响,例如 身高数据如果是:123,110,84,72,100,那么升序排序结果将会是 100,110,123,72,84,显然这是不对的。

d.求出身高统计代码实现

 1 import org.apache.spark.SparkConf;
 2 import org.apache.spark.api.java.JavaRDD;
 3 import org.apache.spark.api.java.JavaSparkContext;
 4 import org.apache.spark.api.java.function.FlatMapFunction;
 5 import org.apache.spark.api.java.function.Function;
 6 import java.util.Arrays;
 7 /**
 8  * Created by Administrator on 2017/11/17.
 9  */
10 public class PeopleInfoCalculator {
11     public static void main(String[] args){
12         SparkConf sparkConf = new SparkConf().setAppName("PeopleInfoCalculator").setMaster("local[3]");
13         JavaSparkContext sc = new JavaSparkContext(sparkConf);
14         JavaRDD<String> dataFile = sc.textFile("F:\\PeopleInfo.txt");
15 
16         JavaRDD<String> maleFilterData = dataFile.filter(new Function<String, Boolean>() {//过滤出性别为M的数据
17             @Override
18             public Boolean call(String s) throws Exception {
19                 return s.contains("M");
20             }
21         });
22         JavaRDD<String> femaleFilterData = dataFile.filter(new Function<String, Boolean>() {//过滤出性别为F的数据
23             @Override
24             public Boolean call(String s) throws Exception {
25                 return s.contains("F");
26             }
27         });
28         JavaRDD<String> maleHeightData = maleFilterData.flatMap(new FlatMapFunction<String, String>() {//得到性别为M的身高数据
29             @Override
30             public Iterable<String> call(String s) throws Exception {
31                 return Arrays.asList(s.split(" ")[2]);
32             }
33         });
34         JavaRDD<String> femaleHeightData = femaleFilterData.flatMap(new FlatMapFunction<String, String>() {//得到性别为F的身高数据
35             @Override
36             public Iterable<String> call(String s) throws Exception {
37                 return Arrays.asList(s.split(" ")[2]);
38             }
39         });
40         JavaRDD<Integer> maleHeightDataInt = maleHeightData.map(new Function<String, Integer>() {//将字符串格式转化为整型格式
41             @Override
42             public Integer call(String s) throws Exception {
43                 return Integer.parseInt(String.valueOf(s));
44             }
45         });
46         JavaRDD<Integer> femaleHeightDataInt = femaleHeightData.map(new Function<String, Integer>() {//将字符串格式转化为整型格式
47             @Override
48             public Integer call(String s) throws Exception {
49                 return Integer.parseInt(String.valueOf(s));
50             }
51         });
52         //sortBy(<T>,ascending,numPartitions) 解释:
53         //第一个参数是一个函数,该函数的也有一个带T泛型的参数,返回类型和RDD中元素的类型是一致的;
54         //第二个参数是ascending,这参数决定排序后RDD中的元素是升序还是降序,默认是true,也就是升序;
55         //第三个参数是numPartitions,该参数决定排序后的RDD的分区个数,默认排序后的分区个数和排序之前的个数相等,即为this.partitions.size。
56         JavaRDD<Integer> maleHeightLowSort = maleHeightDataInt.sortBy(new Function<Integer,Integer>(){// true表示默认排序,为升序排序,从低到高排
57             public Integer call(Integer s) throws Exception {
58                 return s;
59             }
60         },true,3);
61         JavaRDD<Integer> femaleHeightLowSort = femaleHeightDataInt.sortBy(new Function<Integer,Integer>(){// true表示默认排序,为升序排序,从低到高排
62             public Integer call(Integer s) throws Exception {
63                 return s;
64             }
65         },true,3);
66         JavaRDD<Integer> maleHeightHightSort = maleHeightDataInt.sortBy(new Function<Integer,Integer>(){// false表示为降序排序,从高到低
67             public Integer call(Integer s) throws Exception {
68                 return s;
69             }
70         },false,3);
71         JavaRDD<Integer> femaleHeightHightSort = femaleHeightDataInt.sortBy(new         Function<Integer,Integer>(){// true表示默认排序,为降序排序,从低到高排
72             public Integer call(Integer s) throws Exception {
73                 return s;
74             }
75         },false,3);
76         Integer lowestMale = maleHeightLowSort.first(); //求出升序的第一个数,即最小值
77         Integer lowestFemale = femaleHeightLowSort.first();//求出升序的第一个数,即最小值
78         Integer highestMale = maleHeightHightSort.first();//求出降序的第一个数,即最大值
79         Integer highestFemale = femaleHeightHightSort.first();//求出降序的第一个数,即最大值
80 
81         System.out.println("Number of Female Peole:" + femaleHeightData.count());//求出女性的总个数
82         System.out.println("Number of Male Peole:" + maleHeightData.count());//求出男性的总个数
83         System.out.println("Lowest Male:" + lowestMale);//求出男性最矮身高
84         System.out.println("Lowest Female:" + lowestFemale);//求出女性最矮身高
85         System.out.println("Highest Male:" + highestMale);//求出男性最高身高
86         System.out.println("Highest Female:" + highestFemale);//求出女性最高身高
87 
88     }
89 }

 

e.运行结果:

 

转载于:https://www.cnblogs.com/jinggangshan/p/8109329.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React学习小结(二)

一、组件的嵌套 1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"UTF-8">5 <title></title>6 <script src"react.min.js" type"text/javascript" charset"utf-8"></script>7 <…

PCIE2.0/PCIE3.0/PCIE4.0/PCIE5.0接口的带宽、速率计算

一、PCIE接口速率&#xff1a; 二、PCIE相关概念&#xff1a; 传输速率为每秒传输量GT/s&#xff0c;而不是每秒位数Gbps&#xff0c;因为传输量包括不提供额外吞吐量的开销位&#xff1b; 比如 PCIe 1.x和PCIe 2.x使用8b / 10b编码方案&#xff0c;导致占用了20% &#xff08…

hql语法

HQL查询&#xff1a;Criteria查询对查询条件进行了面向对象封装&#xff0c;符合编程人员的思维方式&#xff0c;不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性&#xff0c;因此Hibernate将HQL查询方式立为官方推荐的标准查询方式&#xff0c;HQL查…

InfiniBand简介

一&#xff0e;什么是infiniband InfiniBand架构是一种支持多并发链接的“转换线缆”技术&#xff0c;它是新一代服务器硬件平台的I/O标准。由于它具有高带宽、低延时、 高可扩展性的特点&#xff0c;它非常适用于服务器与服务器&#xff08;比如复制&#xff0c;分布式工作等…

阿里云Aliplayer高级功能介绍(一):视频截图

基本介绍H5 Video是不提供截图的API的&#xff0c; 视频截图需要借助Canvas&#xff0c;通过Canvas提供的drawImage方法&#xff0c;把Video的当前画面渲染到画布上&#xff0c; 最终通过toDataURL方法可以导出图片的base64编码&#xff0c;基本就完成了图片截图的功能。 功能实…

分页

1.首先在数据库中建立一个视图&#xff08;在aspx中sql查询语句是view_student不是student&#xff09;&#xff0c;在视图里创建create view view_student--创建视图as row_number 行号 一条数据是一行 分页功能要根据行数运算select *,row_number() over(order by stuNo desc…

PCIE总线-PCI、PCIE关系及信号定义

PCI(Peripheral Component Interconnect)总线规范在上世纪九十年代由Intel提出。在处理器体系结构中&#xff0c;PCI总线属于局部总线(Local Bus)。局部总线作为系统总线的延伸&#xff0c;主要功能是为了连接外部设备。 处理器主频的不断提升&#xff0c;要求速度更快&#x…

SQL Server:SQL Like 通配符特殊用法:Escape

%&#xff1a;匹配零个及多个任意字符&#xff1b; _&#xff1a;与任意单字符匹配&#xff1b; []&#xff1a;匹配一个范围&#xff1b; [^]&#xff1a;排除一个范围 &#xff1b;-&#xff1a;连字符 Symbol Meaning like 5[%] 5% like [_]n _n like [a-cdf] a, b, c, d, o…

案例篇-HBase RowKey 设计指南

1.为什么 Rowkey 这么重要 1.1 RowKey 到底是什么 我们常说看一张 HBase 表设计的好不好&#xff0c;就看它的 RowKey 设计的好不好。可见 RowKey 在 HBase 中的地位。那么 RowKey 到底是什么?RowKey 的特点 如下: 类似于 MySQL、Oracle 中的主键&#xff0c;用于标示唯一的行…

PCIe简介及引脚定义

随着现代处理器技术的发展&#xff0c;在互连领域中&#xff0c;使用高速差分总线替代并行总线是大势所趋。与单端并行信号相比&#xff0c;高速差分信号可以使用更高的时钟频率&#xff0c;从而使用更少的信号线&#xff0c;完成之前需要许多单端并行数据信号才能达到的总线带…

IDEA下搜狗输入法输入中文时卡着不动的参考解决方法

【问题描述】 在IntelliJ IDEA工具的java编辑窗口&#xff0c;给代码增加注释时发现&#xff0c;输入中文时&#xff0c;搜狗输入法界面不动&#xff0c;只显示第一个字母。如图&#xff1a; 我想输入“根据”两个字&#xff0c;但搜狗输入法界面一直卡着不刷新&#xff0c;导…

七 web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理...

如果爬虫没有异常处理&#xff0c;那么爬行中一旦出现错误&#xff0c;程序将崩溃停止工作&#xff0c;有异常处理即使出现错误也能继续执行下去 1.常见状态吗 301&#xff1a;重定向到新的URL&#xff0c;永久性302&#xff1a;重定向到临时URL&#xff0c;非永久性304&#x…

DVI和HDMI中的TMDS接口协议

TMDS&#xff08;Transition Minimized Differential signal&#xff09;&#xff0c;即过渡调制差分信号&#xff0c;也被称为最小化传输差分信号&#xff0c;是指通过异或及异或非等逻辑算法将原始信号数据转换成10位&#xff0c;前8为数据由原始信号经运算后获得&#xff0c…

TMDS的信号通道

1 TMDS的信号通道&#xff1a; 1个HDMI包括3个TMDS数据通道和1个TMDS时钟通道。 . 每一个TMDS时钟周期内&#xff0c;TMDS数据通道上会发送一个10位的字符信息&#xff1b; . 每个TMDS时钟周期内&#xff0c;编码器将2位的控制数据、4位的报数据或者8位的视频数据采取不同 …

[luoguP2774] 方格取数问题(最大点权独立集)

传送门 引入两个概念&#xff1a; 最小点权覆盖集&#xff1a;满足每一条边的两个端点至少选一个的最小权点集。 最大点权独立集&#xff1a;满足每一条边的两个端点最多选一个的最大权点集。 现在对网格染色&#xff0c;使得相邻两点颜色不同&#xff0c;之后把两个颜色的点分…

光谱分布、光谱辐射通量密度与不同时间段分布光谱(图示)

1、光谱分布图 2 太阳辐射能量图 3、不同时间段的太阳分布光谱图 4、不同波长的光的能量分布主要区域 5、不同波段的使用场景

基于深度学习和传统算法的人体姿态估计,技术细节都讲清楚了

计算机视觉的一大研究热点是人体姿态估计&#xff0c;还有很多问题急需解决&#xff0c;比如遮挡&#xff0c;交互等等。在最近的CVPR2020里边也有很多这方面的工作。本文站长主要是想谈谈基于深度学习的实时多人姿态估计。 人体姿态估计要干嘛&#xff1f; 关于人类活动规律的…

杨浦区阜盛农民工子弟小学见闻

天气有些阴沉&#xff0c;起了个大早&#xff0c;一个小时奔波后来到了这里…… 大门口&#xff1a; 校领导&#xff1a; 有些破旧的校舍和阴沉的天空下祖国的希望&#xff1a; 同上&#xff0c;希望…… 期待的目光&#xff1a; 顽皮的笑脸&#xff0c;排着队也要调皮&#xf…

人体姿态估计算法之open pose

一&#xff0c;openpose是一种自底向上的算法&#xff1a; OpenPose人体姿态识别项目是美国卡耐基梅隆大学&#xff08;CMU&#xff09;基于卷积神经网络和监督学习并以Caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人&am…