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

 

  1 package spark_example01;
  2 
  3 import org.apache.spark.SparkConf;
  4 import org.apache.spark.api.java.JavaRDD;
  5 import org.apache.spark.api.java.JavaSparkContext;
  6 import org.apache.spark.api.java.function.FlatMapFunction;
  7 import org.apache.spark.api.java.function.Function;
  8 import java.util.Arrays;
  9 /**
 10  * Created by Administrator on 2017/11/17.
 11  */
 12 public class PeopleInfoCalculator {
 13     public static void main(String[] args){
 14 
 15         SparkConf sparkConf = new SparkConf().setAppName("PeopleInfoCalculator").setMaster("local[3]");
 16 
 17         JavaSparkContext sc = new JavaSparkContext(sparkConf);
 18 
 19         JavaRDD<String> dataFile = sc.textFile("/Users/xls/Desktop/code/bigdata/data/PeopleInfo.txt");
 20 
 21         // step1:过滤出性别为M的数据
 22         JavaRDD<String> maleFilterData = dataFile.filter(new Function<String, Boolean>() {
 23 
 24             public Boolean call(String s) throws Exception {
 25                 return s.contains("M");
 26             }
 27         });
 28 
 29         //step2:过滤出性别为F的数据
 30         JavaRDD<String> femaleFilterData = dataFile.filter(new Function<String, Boolean>() {
 31 
 32             public Boolean call(String s) throws Exception {
 33                 return s.contains("F");
 34             }
 35         });
 36 
 37         //setp3:得到性别为M的身高数据---对每一行的字符串进行切分,最后取[2]这个字符串---flatMap常用于字符串切分
 38         JavaRDD<String> maleHeightData = maleFilterData.flatMap(new FlatMapFunction<String, String>() {
 39             @Override
 40             public java.util.Iterator<String> call(String s) throws Exception {
 41                 return Arrays.asList(s.split(" ")[2]).iterator();
 42             }
 43         });
 44 
 45         // step4:得到性别为F的身高数据---对每一行的字符串进行切分,最后取[2]这个字符串---flatMap常用于字符串切分
 46         JavaRDD<String> femaleHeightData = femaleFilterData.flatMap(new FlatMapFunction<String, String>() {
 47             @Override
 48             public java.util.Iterator<String> call(String s) throws Exception {
 49                 return Arrays.asList(s.split(" ")[2]).iterator();
 50             }
 51         });
 52 
 53         // step5:将男性身高的字符串格式转化为整型格式
 54         JavaRDD<Integer> maleHeightDataInt = maleHeightData.map(new Function<String, Integer>() {//
 55             @Override
 56             public Integer call(String s) throws Exception {
 57                 return Integer.parseInt(String.valueOf(s));
 58             }
 59         });
 60 
 61         //step6:将女性身高的字符串格式转化为整型格式
 62         JavaRDD<Integer> femaleHeightDataInt = femaleHeightData.map(new Function<String, Integer>() {//将字符串格式转化为整型格式
 63             @Override
 64             public Integer call(String s) throws Exception {
 65                 return Integer.parseInt(String.valueOf(s));
 66             }
 67         });
 68 
 69         //sortBy(<T>,ascending,numPartitions) 解释:
 70         //第一个参数是一个函数,该函数的也有一个带T泛型的参数,返回类型和RDD中元素的类型是一致的;
 71         //第二个参数是ascending,这参数决定排序后RDD中的元素是升序还是降序,默认是true,也就是升序;
 72         //第三个参数是numPartitions,该参数决定排序后的RDD的分区个数,默认排序后的分区个数和排序之前的个数相等,即为this.partitions.size。
 73 
 74         //step7:对男性身高按着从低到高进行排序---参数true表示默认排序,为升序排序,从低到高排
 75         JavaRDD<Integer> maleHeightLowSort = maleHeightDataInt.sortBy(new Function<Integer,Integer>(){
 76             public Integer call(Integer s) throws Exception {
 77                 return s;
 78             }
 79         },true,3);
 80 
 81         //step8:对女性身高按着从低到高进行排序---参数true表示默认排序,为升序排序,从低到高排
 82         JavaRDD<Integer> femaleHeightLowSort = femaleHeightDataInt.sortBy(new Function<Integer,Integer>(){
 83             public Integer call(Integer s) throws Exception {
 84                 return s;
 85             }
 86         },true,3);
 87 
 88         //step9:对男性身高按着从高到低进行排序---false表示为降序排序,从高到低
 89         JavaRDD<Integer> maleHeightHightSort = maleHeightDataInt.sortBy(new Function<Integer,Integer>(){
 90             public Integer call(Integer s) throws Exception {
 91                 return s;
 92             }
 93         },false,3);
 94 
 95         //step10:对女性身高按着从高到低进行排序---false表示为降序排序,从高到低
 96         JavaRDD<Integer> femaleHeightHightSort = femaleHeightDataInt.sortBy(new Function<Integer,Integer>(){
 97             public Integer call(Integer s) throws Exception {
 98                 return s;
 99             }
100         },false,3);
101 
102         Integer lowestMale = maleHeightLowSort.first(); //求出升序的第一个数,即最小值
103         Integer lowestFemale = femaleHeightLowSort.first();//求出升序的第一个数,即最小值
104         Integer highestMale = maleHeightHightSort.first();//求出降序的第一个数,即最大值
105         Integer highestFemale = femaleHeightHightSort.first();//求出降序的第一个数,即最大值
106 
107         System.out.println("Number of Female Peole:" + femaleHeightData.count());//求出女性的总个数
108         System.out.println("Number of Male Peole:" + maleHeightData.count());//求出男性的总个数
109         System.out.println("Lowest Male:" + lowestMale);//求出男性最矮身高
110         System.out.println("Lowest Female:" + lowestFemale);//求出女性最矮身高
111         System.out.println("Highest Male:" + highestMale);//求出男性最高身高
112         System.out.println("Highest Female:" + highestFemale);//求出女性最高身高
113 
114     }
115 }
116 
117 /*
118 * a. 案例描述
119 本案例假设我们需要对某个省的人口 (10万) 性别还有身高进行统计,需要计算出男女人数,男性中的最高和最低身高,以及女性中的最高和最低身高。
120 本案例中用到的源文件有以下格式, 三列分别是 ID,性别,身高 (cm),格式如下:
121 b.人口数据的生成
122 利用Java语言随机生成一组人口数据,包括序列ID,性别M/F,身高cm,代码如下:
123 c. 实例过程分析
124 对于这个案例,我们要分别统计男女的信息,那么很自然的想到首先需要对于男女信息从源文件的对应的 RDD 中进行分离,这样会产生两个新的 RDD,分别包含男女信息;
125 其次是分别对男女信息对应的 RDD 的数据进行进一步映射,使其只包含身高数据,这样我们又得到两个 RDD,分别对应男性身高和女性身高;
126 最后需要对这两个 RDD 进行排序,进而得到最高和最低的男性或女性身高。
127 第一步,先分离男女信息,使用 filter 算子过滤条件包含”M” 的行是男性,包含”F”的行是女性;
128 第二步我们需要使用 map 算子把男女各自的身高数据从 RDD 中分离出来;
129 第三步我们需要使用 sortBy 算子对男女身高数据进行排序。
130 特别注意:RDD 转化的过程中需要把身高数据转换成整数,否则 sortBy 算子会把它视为字符串,那么排序结果就会受到影响,
131 例如 身高数据如果是:123,110,84,72,100,那么升序排序结果将会是 100,110,123,72,84,显然这是不对的。
132 d.求出身高统计代码实现:
133 * */

 

posted on 2019-09-16 23:10  我得去图书馆了  阅读(423)  评论(0编辑  收藏  举报