一、课程设计背景与目标

课程设计背景

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

课程设计目标

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

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

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

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

课程设计目标——例子

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

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

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

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

二、课程设计技术架构

(一) 课程设计技术架构

系统架构概述

1.数据存储模块:

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

3.查询与展示模块:

4. ………….

技术栈详解

分布式文件系统(HDFS)

资源调度(YARN)

数据处理(Hive)

三、项目实施过程

(一)环境部署

(二)数据清洗与预处理

(三)数据分析与查询

(四)结果展示与可视化

(一)环境部署

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

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

(二)数据清洗与预处理

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

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

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

(三)数据分析与查询

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

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

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

(四)结果展示与可视化

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

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

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

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

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

1. 步骤概述

MapReduce 读取数据并进行预处理

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

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

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

分析 Hive 中的数据

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

可视化

  -   用镝数图表可视化数据
      

扩展

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

2. 详细步骤

image-20241230154731012

原始数据

image-20241229104739997

2.1 MapReduce 处理数据并导入 Hive

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

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 表

CREATE TABLE crops_data (
    rainfall FLOAT,
    temperature FLOAT,
    ph FLOAT,
    crop STRING,
    production FLOAT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

2. 将清洗后的数据加载到 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 相同。

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.检查缺失值

SELECT * 
FROM crops_data 
WHERE rainfall IS NULL 
   OR temperature IS NULL 
   OR ph IS NULL 
   OR production IS NULL;

3. 去除异常值

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分析数据

#获取作物分组后四个指标的平均值
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

获取作物分组后三个指标与产量的相关性
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

获取作物分组后四个指标的最大值和最小值
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

获取每个作物产量最大的一条记录然后根据作物产量全局排序:
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

获取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