• 【spark 算子案例】


     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 * */
  • 相关阅读:
    命令模式
    装饰模式 decorator
    儒道佛
    Facade模式
    Adapter
    TListView ItemCheck CheckedItems
    观 徼 偶 感
    c# Mid 子窗体 盖住 控件
    pycharm 连接mysql时区问题
    django_drf
  • 原文地址:https://www.cnblogs.com/xuelisheng/p/11530903.html
Copyright © 2020-2023  润新知