• spark 应用场景1-求年龄平均值


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

    该案例中,我们将假设我们需要统计一个 10 万人口的所有人的平均年龄,当然如果您想测试 Spark 对于大数据的处理能力,您可以把人口数放的更大,比如 1 亿人口,当然这个取决于测试所用集群的存储容量。假设这些年龄信息都存储在一个文件里,并且该文件的格式如下,第一列是 ID,第二列是年龄。如下图格式: 

    以下利用java随机生成10万个人口年龄文件

     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 DataFileGenerator {
    10     public static void main(String[] args){
    11         File file = new File("F:\DataFile.txt");
    12         try {
    13             FileWriter fileWriter = new FileWriter(file);
    14             Random rand = new Random();
    15             for (int i=1;i<=100000;i++){
    16                 fileWriter.write(i +" " + (rand.nextInt(100)+1));
    17                 fileWriter.write(System.getProperty("line.separator"));
    18             }
    19             fileWriter.flush();
    20             fileWriter.close();
    21 
    22         }catch(IOException e){
    23             e.printStackTrace();
    24         }
    25     }
    26 }

    场景分析:

    要计算平均年龄,那么首先需要对源文件对应的 RDD 进行处理,也就是将它转化成一个只包含年龄信息的 RDD,其次是计算元素个数即为总人数,然后是把所有年龄数加起来,最后平均年龄=总年龄/人数。 
    对于第一步我们需要使用 map 算子把源文件对应的 RDD 映射成一个新的只包含年龄数据的 RDD,很显然需要对在 map 算子的传入函数中使用 split 方法,得到数组后只取第二个元素即为年龄信息;第二步计算数据元素总数需要对于第一步映射的结果 RDD 使用 count 算子;第三步则是使用 reduce 算子对只包含年龄信息的 RDD 的所有元素用加法求和;最后使用除法计算平均年龄即可。

    以下实现对平均年龄的计算的代码:

     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 org.apache.spark.api.java.function.Function2;
     7 import java.util.Arrays;
     8 
     9 /**
    10  * Created by Administrator on 2017/11/13.
    11  */
    12 public class AvgAgeCalculator {
    13     public static void main(String[] args){
    14 
    15         SparkConf sparkConf = new SparkConf().setAppName("AvgAgeCalculator").setMaster("local[3]");
    16         JavaSparkContext sc = new JavaSparkContext(sparkConf);
    17         //读取文件
    18         JavaRDD<String> dataFile = sc.textFile("F:\DataFile.txt");
    19         //数据分片并取第二个数
    20         JavaRDD<String> ageData = dataFile.flatMap(new FlatMapFunction<String, String>() {
    21             @Override
    22             public Iterable<String> call(String s) throws Exception {
    23                 return Arrays.asList(s.split(" ")[1]);
    24             }
    25         });
    26         //求出所有年龄个数。
    27         long count = ageData.count();
    28         //转换数据类型
    29         JavaRDD<Integer> ageDataInt = ageData.map(new Function<String, Integer>() {
    30             @Override
    31             public Integer call(String s) throws Exception {
    32                 return Integer.parseInt(String.valueOf(s));
    33             }
    34         });
    35         //求出年龄的和
    36         Integer totalAge = ageDataInt.reduce(new Function2<Integer, Integer, Integer>() {
    37             @Override
    38             public Integer call(Integer x, Integer y) throws Exception {
    39                 return x+y;
    40             }
    41         });
    42         //平均值结果为double类型
    43         Double avgAge = totalAge.doubleValue()/count;
    44         /*System.out.println(ageData.collect());
    45         System.out.println(count);*/
    46         System.out.println("Total Age:" + totalAge + ";    Number of People:" + count );
    47         System.out.println("Average Age is " + avgAge);
    48 
    49     }
    50 }

    运行结果:

    从结果可以看出,计算出所以年龄的总和,以及总人数,以及平均年龄值。看似简单的例子,在对数组取值和数据类型转换时候需要特别的注意。

  • 相关阅读:
    sublime插件时间
    git与github
    字符编码笔记:ASCII,Unicode和UTF-8
    阮一峰:互联网协议入门
    从理论到实践,全方位认识DNS
    ci事务
    linux下启动oracle
    Java连接Oracle
    我的博客终于开通了,加油!
    FILTER 执行次数
  • 原文地址:https://www.cnblogs.com/jinggangshan/p/8109124.html
Copyright © 2020-2023  润新知