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

本文介绍了一个使用Spark处理大数据集的应用案例,通过Java程序生成了10万人的年龄数据,并使用Spark进行年龄数据的读取、解析及计算平均年龄。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文引自:http://blog.youkuaiyun.com/fengzhimohan/article/details/78535143  

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

 

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

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;

/**
 * Created by Administrator on 2017/11/13.
 */
public class DataFileGenerator {
    public static void main(String[] args){
        File file = new File("F:\\DataFile.txt");
        try {
            FileWriter fileWriter = new FileWriter(file);
            Random rand = new Random();
            for (int i=1;i<=100000;i++){
                fileWriter.write(i +" " + (rand.nextInt(100)+1));
                fileWriter.write(System.getProperty("line.separator"));
            }
            fileWriter.flush();
            fileWriter.close();

        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

 

场景分析:

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

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

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import java.util.Arrays;

/**
 * Created by Administrator on 2017/11/13.
 */
public class AvgAgeCalculator {
    public static void main(String[] args){

        SparkConf sparkConf = new SparkConf().setAppName("AvgAgeCalculator").setMaster("local[3]");
        JavaSparkContext sc = new JavaSparkContext(sparkConf);
        //读取文件
        JavaRDD<String> dataFile = sc.textFile("F:\\DataFile.txt");
        //数据分片并取第二个数
        JavaRDD<String> ageData = dataFile.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public Iterable<String> call(String s) throws Exception {
                return Arrays.asList(s.split(" ")[1]);
            }
        });
        //求出所有年龄个数。
        long count = ageData.count();
        //转换数据类型
        JavaRDD<Integer> ageDataInt = ageData.map(new Function<String, Integer>() {
            @Override
            public Integer call(String s) throws Exception {
                return Integer.parseInt(String.valueOf(s));
            }
        });
        //求出年龄的和
        Integer totalAge = ageDataInt.reduce(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer x, Integer y) throws Exception {
                return x+y;
            }
        });
        //平均值结果为double类型
        Double avgAge = totalAge.doubleValue()/count;
        /*System.out.println(ageData.collect());
        System.out.println(count);*/
        System.out.println("Total Age:" + totalAge + ";    Number of People:" + count );
        System.out.println("Average Age is " + avgAge);

    }
}

复制代码

 

 

运行结果:

 

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

### 使用 Spark 进行客户与交易数据分析 #### 数据准备阶段 在进行任何分析之前,需要加载并预处理数据。假设客户的交易记录存储在一个 CSV 文件中,可以利用 `pyspark` 或 Scala 的 API 来读取文件。 以下是 Python 中的一个示例代码片段用于加载数据: ```python from pyspark.sql import SparkSession # 创建 SparkSession 实例 spark = SparkSession.builder \ .appName("CustomerTransactionAnalysis") \ .getOrCreate() # 加载客户和交易数据 (CSV 格式为例) customer_data = spark.read.csv("path/to/customer_data.csv", header=True, inferSchema=True)[^1] transaction_data = spark.read.csv("path/to/transaction_data.csv", header=True, inferSchema=True) # 查看前几条数据以确认结构 customer_data.show(5) transaction_data.show(5) ``` #### 数据清洗与转换 为了确保后续分析的质量,在此阶段应对缺失值、异常值以及重复项等问题进行清理。可以通过 SQL 查询或者 DataFrame 转换来实现这一目标。 例如去除重复的交易记录: ```python cleaned_transactions = transaction_data.dropDuplicates() ``` 对于某些字段可能存在空缺的情况,则可采用填充策略来解决: ```python filled_customer_info = customer_data.fillna({"income": 0}) # 假设收入列允许零替代 NULL ``` #### 统计描述性指标 通过计算基本统计量了解整体情况是非常重要的一步。这包括但不限于平均数、标准差、最大最小值等。 展示每种产品类型的总销售额及其占比的例子如下所示: ```sql SELECT product_type, SUM(amount) AS total_sales, ROUND(SUM(amount)*100 / (SELECT SUM(amount) FROM transactions), 2) as percentage FROM transactions GROUP BY product_type ORDER BY total_sales DESC; ``` 上述查询语句可以直接嵌入到 PySpark 当中的 sql 方法里执行。 #### 高级分析模型构建 一旦完成了基础层面的数据探索之后就可以着手建立更复杂的预测模型了。比如分类器用来识别潜在流失风险高的用户群体;聚类算法帮助发现具有相似消费习惯的不同细分市场等等。 这里给出一个简单的线性回归案例,目的是评估年龄因素对账户余额的影响程度: ```python from pyspark.ml.regression import LinearRegression lr = LinearRegression(featuresCol='age', labelCol='balance') model = lr.fit(trainingData) print("Coefficients: %s" % str(model.coefficients)) print("Intercept: %s" % str(model.intercept)) ``` 以上仅展示了部分功能模块的应用场景,实际项目当中还需要考虑更多细节方面的工作流程设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值