大数据开发技术课程设计

一、课程设计背景与目标

课程设计背景

随着大数据技术的飞速发展,农业领域也开始逐渐应用大数据分析,以提升生产效率、优化资源配置和加强环境保护。农业生产过程中涉及大量的数据,包括气候、土壤、作物生长、病虫害等信息。通过大数据技术,可以更好地理解农业系统中的各种变量及其相互关系,从而实现精准农业、提高农产品质量、减少资源浪费,并推动可持续发展。例如,通过分析土壤质量、天气变化、作物生长等数据,能够有效地提升农业产量和资源利用效率。本项目旨在通过大数据分析技术,从多个维度分析和解决农业中的实际问题

课程设计目标

选择并分析一个农业问题,利用大数据分析方法解决该问题,并通过三个不同类型的图表展示分析结果。具体目标包括:

1.问题分析:分析并明确一个农业生产中的问题,例如作物生长受土壤质量和气候变化的影响。

2.数据分析:使用大数据分析技术(如MapReduce、Hive、机器学习等)对数据进行清洗、处理和分析。

3.结果展示:通过至少三个不同的图表(如时间序列图、散点图、热力图等)展示数据分析结果,支撑问题的解决方案

课程设计目标——例子

“某地区气候变化对作物生长的影响”

• 气候变化如何影响作物的生长周期?

• 不同气候条件下,作物的产量如何变化?

• 哪些气候因素(如温度、降水量、湿度等)对作物生长最为关键?

二、课程设计技术架构

(一) 课程设计技术架构

系统架构概述

1.数据存储模块:

2.数据处理与分析模块:

3.查询与展示模块:

4. ………….

技术栈详解

分布式文件系统(HDFS)

资源调度(YARN)

数据处理(Hive)

三、项目实施过程

(一)环境部署

(二)数据清洗与预处理

(三)数据分析与查询

(四)结果展示与可视化

(一)环境部署

请详细描述项目中各个组件的安装过程,包括软件、硬件及网络环境的配置。

建议使用流程图的形式清晰地展示整个部署过程

(二)数据清洗与预处理

•方法描述:请说明使用了哪些方法对农业数据进行清洗与预处理,包括数据去重、缺失值处理、异常值检测等。

•数据展示:请粘贴原始数据格式与预处理后的数据截图,以便对比展示数据清洗的效果。

•代码展示:如果使用了MapReduce或Hive等工具进行数据处理,请粘贴相关代码片段,并简要说明其作用

(三)数据分析与查询

•方法描述:请说明使用了哪些方法对处理后的数据进行分析与查询,包括统计分析、数据挖掘、机器学习算法等。

•问题解决:请对处理后的数据进行解释分析,说明这些数据如何帮助你解决了在背景部分提到的农业问题。

•代码展示:如果使用了MapReduce或Hive等工具进行数据分析,请粘贴相关代码片段,并简要说明其实现的功能。

(四)结果展示与可视化

•方法描述:请说明使用了哪些方式对结果进行可视化展示,包括图表类型(如柱状图、折线图、散点图等)和可视

化工具(如Excel、Tableau、Echarts、Python等)。

•结论分析:请从图表中提炼出关键结论,这些结论应直接关联到项目目标的实现情况。例如,通过数据分析发现某

种病虫害的预防措施显著提高了作物产量;或者通过资源优化管理,降低了化肥和农药的使用量等。

大数据开发技术课程设计步骤

1. 步骤概述

NaN. MapReduce 读取数据并进行预处理

-   去重。
    
-   将清洗后的数据写入 Hive 表。

NaN. Hive 中进行缺失值和异常值处理

-   检测缺失值 无缺失值
    
-   在 Hive 中计算每列的均值和标准差。
    
-   计算每行的 Z-score 并根据阈值(如 Z > 3 或 Z < -3)进行异常值筛选。

NaN. 分析 Hive 中的数据

-   选取合适的指标
    
-   在 Hive 中进行数据分析。

NaN. 可视化

-   用镝数图表可视化数据

NaN. 扩展

-   将hive清洗后的数据用来模型训练,构建作物预测系统

2. 详细步骤

image-20241230154731012

原始数据

image-20241229104739997

2.1 MapReduce 处理数据并导入 Hive

我们使用 Hadoop MapReduce 来读取 HDFS 上的数据进行预处理(去重),然后将数据导入到 Hive 中进行后续处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.cqyti.kcsj.mapreduce;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
import java.util.HashSet;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.log4j.Logger;

// 数据预处理类
public class DataPreprocessing {
   // 日志记录器,用于记录程序运行信息
   private static final Logger logger = Logger.getLogger(DataPreprocessing.class);

   // 主方法,程序入口
   public static void main(String[] args) throws Exception {
       // 创建 Hadoop 配置对象
       Configuration conf = new Configuration();
       // 获取文件系统对象
       FileSystem fs = FileSystem.get(conf);
       // 初始化 MapReduce 任务
       Job job = Job.getInstance(conf, "Data Preprocessing");
       // 设置运行主类
       job.setJarByClass(DataPreprocessing.class);
       // 设置 Mapper 类
       job.setMapperClass(DataPreprocessingMapper.class);
       // 设置 Reducer 类
       job.setReducerClass(DataPreprocessingReducer.class);
       // 设置输出的 key 的类型
       job.setOutputKeyClass(Text.class);
       // 设置输出的 value 的类型
       job.setOutputValueClass(Text.class);
       // 设置输入路径
       Path inputPath = new Path("/Tipdm/Hadoop/MapReduce/crops_data.csv");
       // 设置输出路径
       Path outputPath = new Path("/Tipdm/Hadoop/MapReduce/Result");

       // 如果输出路径已存在,则删除
       if (fs.exists(outputPath)) {
           fs.delete(outputPath, true);
      }

       // 设置任务的输入路径
       FileInputFormat.addInputPath(job, inputPath);
       // 设置任务的输出路径
       FileOutputFormat.setOutputPath(job, outputPath);

       // 提交任务并等待执行完成
       System.exit(job.waitForCompletion(true) ? 0 : 1);
  }

   // Mapper 类,用于处理每行数据,将其作为 key 输出
   public static class DataPreprocessingMapper extends Mapper<Object, Text, Text, Text> {
       // 用于标识是否是表头行
       private boolean isHeader = true;

       @Override
       public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
           // 如果是表头行,直接跳过
           if (isHeader) {
               isHeader = false; // 只跳过第一行
               return;
          }
           // 将当前行转换为字符串
           String line = value.toString();
           // 将行内容作为 key 输出,value 设置为空字符串
           context.write(new Text(line), new Text(""));
      }
  }

   // Reducer 类,用于对 Mapper 输出的数据进行去重
   public static class DataPreprocessingReducer extends Reducer<Text, Text, Text, Text> {

       @Override
       public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
           // 每个 key 是唯一的,直接输出即可,实现去重
           context.write(key, null);
      }
  }
}

MapReduce去重后数据

image-20241229105212421

2.2. 导入数据到 Hive

将 MapReduce 作业生成的清洗后的数据导入 Hive 表:

NaN. 创建 Hive 表

1
2
3
4
5
6
7
8
9
10
CREATE TABLE crops_data (
  rainfall FLOAT,
  temperature FLOAT,
  ph FLOAT,
  crop STRING,
  production FLOAT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
  1. 将清洗后的数据加载到 Hive 表

    LOAD DATA INPATH ‘/Tipdm/Hadoop/MapReduce/Result’ INTO TABLE crops_data;

2.3 缺失值和异常值处理

在 Hive 中进行 Z-score 计算,并筛选出异常值。使用以下 SQL 语句来实现这个过程。

1. 创建新表

首先,创建一个新的 Hive 表 cleaned_crops_data,该表结构与原表 crops_data 相同。

1
2
3
4
5
6
7
8
9
10
CREATE TABLE cleaned_crops_data (
  rainfall FLOAT,
  temperature FLOAT,
  ph FLOAT,
  crop STRING,
  production FLOAT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

2.检查缺失值

1
2
3
4
5
6
SELECT * 
FROM crops_data
WHERE rainfall IS NULL
  OR temperature IS NULL
  OR ph IS NULL
  OR production IS NULL;

3. 去除异常值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
WITH stats AS (
   -- 计算数据集中各个变量(降雨量、气温、pH 值、产量)的均值和标准差
   SELECT
       AVG(Rainfall) AS mean_rainfall,         -- 计算降雨量的均值
       STDDEV(Rainfall) AS std_rainfall,      -- 计算降雨量的标准差
       AVG(Temperature) AS mean_temperature, -- 计算气温的均值
       STDDEV(Temperature) AS std_temperature, -- 计算气温的标准差
       AVG(Ph) AS mean_ph,                   -- 计算 pH 值的均值
       STDDEV(Ph) AS std_ph,                 -- 计算 pH 值的标准差
       AVG(Production) AS mean_production,   -- 计算产量的均值
       STDDEV(Production) AS std_production -- 计算产量的标准差
   FROM crops_data
),
z_scores AS (
   -- 计算每个作物数据的 Z 分数(标准化分数)
   SELECT
      Crop,                                  -- 作物名称
       (Rainfall - stats.mean_rainfall) / stats.std_rainfall AS z_rainfall,       -- 降雨量的 Z 分数
       (Temperature - stats.mean_temperature) / stats.std_temperature AS z_temperature, -- 气温的 Z 分数
       (Ph - stats.mean_ph) / stats.std_ph AS z_ph,                               -- pH 值的 Z 分数
       (Production - stats.mean_production) / stats.std_production AS z_production -- 产量的 Z 分数
   FROM crops_data, stats                      -- 与统计信息进行笛卡尔连接,计算标准化值
)
-- 将处理后的数据覆盖写入目标表 cleaned_crops_data
INSERT OVERWRITE TABLE cleaned_crops_data
SELECT *
FROM crops_data
WHERE NOT EXISTS (
   -- 排除异常值(Z 分数绝对值大于 3 的记录)
   SELECT 1
   FROM z_scores
   WHERE (ABS(z_rainfall) > 3 OR ABS(z_temperature) > 3 OR ABS(z_ph) > 3 OR ABS(z_production) > 3) -- 判断是否为异常值
   AND crops_data.Crop = z_scores.Crop -- 确保作物名称匹配
);

hive处理缺失值和异常值后数据

image-20241229105341748

2.4. hive分析数据

1
2
3
4
5
6
7
8
9
#获取作物分组后四个指标的平均值
CREATE table avg_crops_data1 AS
SELECT crop,
      AVG(rainfall) AS avg_rainfall,
      AVG(temperature) AS avg_temperature,
      AVG(ph) AS avg_ph,
      AVG(production) AS avg_production
FROM cleaned_crops_data
GROUP BY crop;

image-20241229105650738

1
2
3
4
5
6
7
8
获取作物分组后三个指标与产量的相关性
CREATE TABLE corr_crops_data AS
SELECT crop,
      CORR(rainfall, production) AS corr_rainfall_production,
      CORR(temperature, production) AS corr_temperature_production,
      CORR(ph, production) AS corr_ph_production
FROM cleaned_crops_data
GROUP BY crop;

image-20241229105750265

1
2
3
4
5
6
7
8
9
10
11
12
13
获取作物分组后四个指标的最大值和最小值
CREATE TABLE extremal_crops_data AS
SELECT crop,
      MIN(rainfall) AS min_rainfall,
      MAX(rainfall) AS max_rainfall,
      MIN(temperature) AS min_temperature,
      MAX(temperature) AS max_temperature,
      MIN(ph) AS min_ph,
      MAX(ph) AS max_ph,
      MIN(production) AS min_production,
      MAX(production) AS max_production
FROM cleaned_crops_data
GROUP BY crop;

image-20241229105830983

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
获取每个作物产量最大的一条记录然后根据作物产量全局排序:
CREATE TABLE best_crops_data AS
SELECT crop,
      rainfall AS best_rainfall,
      temperature AS best_temperature,
      ph AS best_ph,
      production AS best_production
FROM (
   SELECT crop,
          rainfall,
          temperature,
          ph,
          production,
          ROW_NUMBER() OVER (PARTITION BY crop ORDER BY production DESC) AS rn
   FROM cleaned_crops_data
) subquery
WHERE rn = 1
ORDER BY best_production DESC;

image-20241229105913408

1
2
3
4
5
6
7
8
9
获取grapes作物环境影响情况
CREATE TABLE grapes_data AS
SELECT crop,
      rainfall,
      temperature,
      ph,
      production
FROM cleaned_crops_data
WHERE crop='Grapes';

image-20241229110012740

2.5 可视化数据

image-20241230154759932

https://dycharts.com/xshow/index.html?id=1b979759f6ae1a741c924841a17ab026

2.6 扩展

将hive清洗后的数据用来模型训练,构建作物预测系统

image-20241230155232758


大数据开发技术课程设计
http://example.com/2024/12/20/大数据开发技术课程设计/
作者
Tingfeng
发布于
2024年12月20日
许可协议