一、课程设计背景与目标
课程设计背景
随着大数据技术的飞速发展,农业领域也开始逐渐应用大数据分析,以提升生产效率、优化资源配置和加强环境保护。农业生产过程中涉及大量的数据,包括气候、土壤、作物生长、病虫害等信息。通过大数据技术,可以更好地理解农业系统中的各种变量及其相互关系,从而实现精准农业、提高农产品质量、减少资源浪费,并推动可持续发展。例如,通过分析土壤质量、天气变化、作物生长等数据,能够有效地提升农业产量和资源利用效率。本项目旨在通过大数据分析技术,从多个维度分析和解决农业中的实际问题
课程设计目标
选择并分析一个农业问题,利用大数据分析方法解决该问题,并通过三个不同类型的图表展示分析结果。具体目标包括:
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. 详细步骤

原始数据

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去重后数据

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处理缺失值和异常值后数据

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;

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

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

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

获取grapes作物环境影响情况
CREATE TABLE grapes_data AS
SELECT crop,
rainfall,
temperature,
ph,
production
FROM cleaned_crops_data
WHERE crop='Grapes';

2.5 可视化数据

https://dycharts.com/xshow/index.html?id=1b979759f6ae1a741c924841a17ab026
2.6 扩展
将hive清洗后的数据用来模型训练,构建作物预测系统

