使用Hadoop分析气象数据(附代码)

news2024/11/15 3:27:54

刚学了Hadoop,在网上找完整的分析使用过程进行练手观看。本文数据和方法均来自于大佬的使用Hadoop分析气象数据完整版(附带完整代码)(侵删)

文章目录

  • 1.获取数据
    • 1.1下载数据
  • 1.2 数据格式
    • 1.3 合并数据
  • 2.MapReduce处理数据
    • 2.1 环境配置,启动集群
    • 2.2 文件上传到HDFS
    • 2.3 编写MapReduce代码
      • 2.3.1 TemperatureMapper
      • 2.3.2 TemperatureReducer
      • 2.3.3 JobMain
  • 2.4 执行程序
    • 2.4.1 打包上传
      • 2.4.2 运行
  • 3.导入数据到Hive
  • 4.Hive数据分析
    • 4.1 查询2019全年平均温度
    • 4.2 查询2019全年高于平均温度的天数
  • 5.使用Sqoop导入数据到Mysql
    • 5.1Mysql创建数据库
    • 5.2 开始导入
  • 6.展示数据
    • 6.1 前端代码
    • 6.2 后端代码
      • controller层
      • Service层
      • Service实现类
      • 实体类
      • Mapper
  • 问题解决

注意:为了不出现横向拖拉,命令里我加了换行,所有命令都是如此。复制进命令行时记得去掉换行!

1.获取数据

1.1下载数据

wget -D --accept-regex=REGEX -P data -r 
	-c ftp://ftp.ncdc.noaa.gov/pub/data/noaa/isd-lite/2019/5*

下载时可能会出现卡顿中断下载,按Ctrl+c结束下载,然后重复下载就可以了(网不好的多试几次)
我是全部下载完了,我这时候一共有这么多
在这里插入图片描述

1.2 数据格式

截取部分数据,格式如下:

2019 01 01 00   -65  -123 10199   345    95     8 -9999 -9999
2019 01 01 01   -62  -115 10213   350    86 -9999 -9999 -9999
2019 01 01 02   -62  -110 10223   343    86 -9999 -9999 -9999
2019 01 01 03   -62  -114 10234   337    77 -9999 -9999 -9999
2019 01 01 04   -62  -118 10242   345    86 -9999 -9999 -9999
2019 01 01 05   -62  -116 10252   331    63 -9999 -9999 -9999
2019 01 01 06   -62  -114 10259   306    38     6 -9999 -9999
2019 01 01 07   -62  -114 10264   281    29 -9999 -9999 -9999
2019 01 01 08   -62  -113 10268   268    39 -9999 -9999 -9999
2019 01 01 09   -59  -116 10271   254    31     3 -9999 -9999
2019 01 01 10   -62  -115 10271   238    24 -9999 -9999 -9999
2019 01 01 11   -80  -122 10269   254    12 -9999 -9999 -9999
2019 01 01 12   -67  -103 10264   322    12     5 -9999 -9999
2019 01 01 13   -62  -100 10261    27    13 -9999 -9999 -9999
2019 01 01 14   -29   -72 10259   230    40 -9999 -9999 -9999
2019 01 01 15   -20   -67 10254   242    49     5 -9999 -9999

字段解释如下:

字段1:位置1-4,长度4:观测年份,四舍五入到最接近
字段2:位置6-7,长度2:观察月,四舍五入到最接近
字段3:位置9-11,长度2:观察日,四舍五入到最接近
字段4:位置12-13,长度2:观察时,四舍五入到最接近
字段5:位置14-19,长度6:空气温度,单位:摄氏度,比例因子:10,缺少值:-9999,
字段6:位置20-24,长度6:露点温度,为了达到饱和,必须在恒定的压力和水蒸气含量下
	冷却给定的空气包的温度。单位:摄氏度,比例因子:10,缺少值:-9999
字段7:Pos 26-31,长度6:海平面压力,相对于平均海平面的气压。单位:公顷,比例因
	子:10,缺少值:-9999
字段8:32-37号位置,长度6:风向。正北角在正北和风向之间以顺时针方向测量的角度。
	单位:角度。比例因子:1,缺少值:-9999。*注:静风风向编码为0。
字段9:38-43位置,长度6:风速,空气通过一个固定点的水平运动速度。单位:米每秒。
	比例因子:10。缺少值:-9999
字段10:位置44-49,长度6:天空状况总覆盖代码,表示被云层或其它遮蔽现象覆盖的整个穹
	顶的一部分的代码。缺少值:-9999
	域:
		0:无,SKC或CLR
		1: 一个okta-1/10或更小但不是零
		2: 两个oktas-2/10-3/10,或几个
		3: 三个oktas-4/10
		4: 四个oktas-5/10,或SCT
		5: 五个oktas-6/10
		6: 六个oktas-7/10-8/10
		7: 七个oktas-9/10或以上,但不是10/10或BKN
		8: 八个oktas-10/10,或OVC
		9: 天空模糊不清,或云量无法估计
		10: 部分遮蔽
		11: 稀散
		12: 分散的
		13: 暗散射
		14: 薄断
		15: 破碎的
		16: 暗断
		17: 薄阴
		18: 阴天
		19: 阴天
字段11:位置50-55,长度6:液体沉淀深度尺寸-持续一小时,在一个小时的积累期内测量
	的液体沉淀的深度。单位:毫米,比例因子:10,缺少值:-9999。*注:痕量降水编码为-1
字段12:位置56-61,长度6:液体沉淀深度尺寸-持续6小时,在六小时的积累期内测量的液
	体沉淀的深度。单位:毫米。比例因子:10。缺少值:-9999。*注:痕量降水编码为-1

字段很多,但是这里我只用前5个字段,任务是统计**每日最高温度、最低温度、平均温度,**有时间的话顺便计算点儿静态统计值。其余字段应该是类似的,正所谓一通百通。

1.3 合并数据

数据很分散,合并数据:将2019目录下的所有以.gz结尾的的文件合并到data.txt
zcat 2019/*.gz > data.txt
到此数据获取完毕

2.MapReduce处理数据

2.1 环境配置,启动集群

可以查看原作者的文章: 大数据学习系列:Hadoop3.0苦命学习(一),本文不再赘述。

2.2 文件上传到HDFS

要保证hadoop已经启动

hdfs dfs -mkdir -p /usr/hadoop/in
hdfs dfs -ls /usr/hadoop/
hdfs dfs -put data.txt /usr/hadoop/in/

查看是否上传成功

hdfs dfs -ls /usr/hadoop/in

在这里插入图片描述

2.3 编写MapReduce代码

2.3.1 TemperatureMapper

public class TemperatureMapper extends Mapper<LongWritable, Text, 
		Text, LongWritable> {

    private static final long MISSING = -9999;

    @Override
    protected void map(LongWritable key, Text value, Context context) 
    		throws IOException, InterruptedException {
        String line = value.toString();
        Iterable<String> split = Splitter.on(" ").omitEmptyStrings().split(line);
        ArrayList<String> arrayList = new ArrayList<>(16);
        for (String s : split) {
            arrayList.add(s);
        }
        // 过滤掉字段不足的数据
        if (arrayList.size() >= 5) {
            String month = arrayList.get(1);
            String day = arrayList.get(2);
            long temperature = Long.parseLong(arrayList.get(4));
            // 过滤掉温度不存在的数据
            if (Math.abs(temperature - MISSING) > 0.0001) {
                context.write(new Text(month + "/" + day), 
                		new LongWritable((temperature)));
            }
        }
    }

}

主要是原数据进行了清洗,过滤了一些不合格的数据。

2.3.2 TemperatureReducer

public class TemperatureReducer extends Reducer<Text, LongWritable, 
		Text, Temperature> {
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, 
    		Context context) throws IOException, InterruptedException {
        long maxTemperature = Long.MIN_VALUE;
        long minTemperature = Long.MAX_VALUE;
        double avgTemperature = 0.0;
        long temp;
        int count = 0;
        if (values!=null) {
            for (LongWritable value: values) {
                temp = value.get();
                maxTemperature = Math.max(temp, maxTemperature);
                minTemperature = Math.min(temp, minTemperature);
                avgTemperature += temp;
                count++;
            }
            Temperature temperature = new Temperature(maxTemperature, 
            		minTemperature, avgTemperature/count);

            context.write(key, temperature);
        }

    }
}

计算出每日温度的最大值、最小值和平均值,并放入Temperature对象中。

2.3.3 JobMain

public class JobMain extends Configured implements Tool {
    @Override
    public int run(String[] strings) throws Exception {
        // 创建一个任务对象
        Job job = Job.getInstance(super.getConf(), "mapreduce_temperature");

        // 打包放在集群运行时,需要做一个配置
        job.setJarByClass(JobMain.class);

        // 第一步:设置读取文件的类:K1和V1
        job.setInputFormatClass(TextInputFormat.class);
        TextInputFormat.addInputPath(job, 
        	new Path("hdfs://node01:8020/usr/hadoop/in"));

        // 第二步:设置Mapper类
        job.setMapperClass(TemperatureMapper.class);
        // 设置Map阶段的输出类型:k2和v2的类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);

        // 第三、四、五、六步采用默认方式(分区,排序,规约,分组)

        // 第七步:设置Reducer类
        job.setReducerClass(TemperatureReducer.class);
        // 设置Reduce阶段的输出类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Temperature.class);


        // 第八步:设置输出类
        job.setOutputFormatClass(TextOutputFormat.class);
        // 设置输出路径
        TextOutputFormat.setOutputPath(job, 
        	new Path("hdfs://node01:8020/usr/hadoop/temperature"));

        boolean b = job.waitForCompletion(true);

        return b?0:1;
    }

    public static void main(String[] args) throws Exception {
        Configuration configuration = new Configuration();
        // 启动一个任务
        ToolRunner.run(configuration, new JobMain(), args);
    }

}

2.4 执行程序

2.4.1 打包上传

可以百度一下

2.4.2 运行

hadoop jar temperature_test-1.0-SNAPSHOT.jar cn.sky.hadoop.JobMain

temperature_test-1.0-SNAPSHOT.jar 为打包后的jar包名
cn.sky.hadoop.JobMain 主程序的目录名

下面为我分析后的数据部分截图。因为我们每个人取得不一样,所以这部分也会一样,出来结果就行
在这里插入图片描述

3.导入数据到Hive

关于Hive的介绍可以看原作者的博文大数据学习系列:Hadoop3.0苦命学习(五)
有个问题,若直接从HDFS导入数据到Hive,HDFS上的数据会丢失。

所以我将数据下载下来,重命名为 ```temperature_data ``
在这里插入图片描述
数据有了,开始创建Hive表:

 create external table temperature (t_date string, t_max double, 
 	t_min double, t_avg double) row format delimited fields terminated by '\t';

加载数据到hive:

load data local inpath '/export/services/temperature_data' overwrite 
	into table temperature;

查前面5条数据,看一眼:

select * from temperature limit 5;

在这里插入图片描述

4.Hive数据分析

弄得简单,就查几个静态数据吧。

4.1 查询2019全年平均温度

select avg(t_avg) from temperature;
最终结果是68.77(因为数据是被放大了10倍)左右
在这里插入图片描述

4.2 查询2019全年高于平均温度的天数

select count(1) from temperature where t_avg > 68.7;
答案是:198天,
在这里插入图片描述
结束演示,查询别的数据可以再自己写相关的语句

5.使用Sqoop导入数据到Mysql

关于Sqoop的相关介绍可以查看原作者的博文大数据学习系列:Hadoop3.0苦命学习(七)

在使用前保证已经安装好MySQL

5.1Mysql创建数据库

CREATE TABLE `temperature` (
  `Tem_Date` varchar(10) NOT NULL,
  `Tem_Max` double DEFAULT NULL,
  `Tem_Min` double DEFAULT NULL,
  `Tem_Avg` double DEFAULT NULL,
  PRIMARY KEY (`Tem_Date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

5.2 开始导入

bin/sqoop export --connect jdbc:mysql://192.168.0.102:3306/userdb 
	--username root --password 123456 --table temperature 
	--export-dir /usr/hadoop/temperature --input-fields-terminated-by "\t"

可以去MySQL查看一下自己的数据。
但是这里我自己操作时没有使用Sqoop成功。也没有使用Linux环境下的数据库。所以是将数据导入到WIndows中来了

6.展示数据

这里前端使用echart,jsp,后端使用Spring、SpringMVC、Mybatis。

代码较多,展示主要的。

6.1 前端代码

主要是这一段,使用Ajax向后台请求数据,然后将数据丢进eChart中。
在这里插入图片描述

6.2 后端代码

controller层

@Autowired
    private TemperatureService tempService;
    @RequestMapping("/getTemperature.action")
    @ResponseBody
    public TemperatureReturnPojo getTemperature(){
        TemperatureReturnPojo temperaturePojo =  tempService.getAllTemperature();
        System.out.println(temperaturePojo);
        return temperaturePojo;
    }

Service层

public interface TemperatureService {
    TemperatureReturnPojo getAllTemperature();
}

Service实现类

@Service
public class TemperatureServiceImpl implements TemperatureService {
    @Autowired
    private TemperatureMapper temperatureMapper;
    @Override
    public TemperatureReturnPojo getAllTemperature() {
        TemperatureReturnPojo temperatureReturnPojo 
        	= new TemperatureReturnPojo();

        ArrayList<String> dates = new ArrayList<>();
        ArrayList<String> maxs = new ArrayList<>();
        ArrayList<String> mins = new ArrayList<>();
        ArrayList<String> avgs = new ArrayList<>();
        DecimalFormat df = new DecimalFormat("#.00");

        List<TemperaturePojo> allTemperature 
        	= temperatureMapper.getAllTemperature();
        for (TemperaturePojo pojo : allTemperature) {
            dates.add(pojo.getTem_Date());
            maxs.add(df.format(pojo.getTem_Max()/10.0));
            mins.add(df.format(pojo.getTem_Min()/10.0));
            avgs.add(df.format(pojo.getTem_Avg()/10.0));
        }
        temperatureReturnPojo.setTem_Dates(dates);
        temperatureReturnPojo.setTem_Maxs(maxs);
        temperatureReturnPojo.setTem_Mins(mins);
        temperatureReturnPojo.setTem_Avgs(avgs);

        return temperatureReturnPojo;
    }
}

实体类

public class TemperaturePojo {
    private String Tem_Date;
    private Double Tem_Max;
    private Double Tem_Min;
    private Double Tem_Avg;
	
	// 省略Get()、Set()、ToString()方法    
}

public class TemperatureReturnPojo {
    private List<String> Tem_Dates;
    private List<String> Tem_Maxs;
    private List<String> Tem_Mins;
    private List<String> Tem_Avgs;
 	// 省略Get()、Set()、ToString()方法    
}   

Mapper

public interface TemperatureMapper {
    List<TemperaturePojo> getAllTemperature();
}

<mapper namespace="cn.itcast.weblog.mapper.TemperatureMapper" >
    <select id="getAllTemperature"   
    		resultType="cn.itcast.weblog.pojo.TemperaturePojo">
        select * from temperature;
    </select>

</mapper>

页面运行结果展示
在这里插入图片描述
在这里插入图片描述
流程完成,撒花~~~

原作者的代码链接:GitHub链接–Hadoop-Analyzes-Weather-Data

问题解决

原作者的前端代码的这个Index.jsp文件可以直接替换到外边那个index就可以直接启动Tomcat后访问到了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01sklearn-机器学习的几种算法(附代码)

说明: 本篇文章主要写了机器学习的流程及一些常用的算法如: 贝叶斯,朴素贝叶斯,线性回归,决策树,随机森林,逻辑斯蒂回归,模型调优和特征工程等(都是使用python的sklearn库实现) 一、概述 二、 一、特征工程 在看下面的算法之前,我们要先对机器学习流程进行一下熟悉! 主要有…

代码随想录算法训练营第五十九天_第九章_动态规划 | 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

LeetCode 583. 两个字符串的删除操作 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 视频讲解https://www.bilibili.com/video/BV1we4y157wB/?spm_id_from333.788&vd_sourcef…

瑞斯拜词汇课第一讲

英语词汇 第一段 1、under the weather 身体不舒服 2、billion 十亿 3、suffer from 遭受 4、high blood pressure 高血压 high blood pressure 高血压 hypertension 高血压 hyper 紧张的5、take steps to do sth 采取措施做某事 take measures to 采取措施 take steps to …

NVME_PCIE_SATA_AHCI_M.2_2.5“

SATA和PCIe两个都是总线标准。它们是并列发展的关系&#xff0c;并不是谁取代谁的关系。 SATA&#xff1a;由IDE/PATA标准发展而来&#xff0c;主要用途是把存贮设备&#xff08;硬盘&#xff09;连接到主机&#xff08;主板&#xff09;。 SATA经历了如下版本&#xff1a; SA…

数影周报:小米汽车供应商被罚100万,1688延迟下线“1688买家旺旺”

本周看点&#xff1a;小米汽车供应商被罚100万&#xff1b;特斯拉将在硅谷招聘AI 人才&#xff1b;阳光出行等25款 App涉违规收集使用个人信息等&#xff1b;1688延迟于2月8日下线“1688买家旺旺”&#xff1b;微蚁科技完成数千万元B轮融资......数据安全那些事小米汽车供应商被…

机器学习实战教程(四):从特征分解到协方差矩阵:详细剖析和实现PCA算法

1. 协方差 概念 方差和标准差的原理和实例演示&#xff0c;请参考 方差 方差&#xff08;Variance&#xff09;是度量一组数据的分散程度。方差是各个样本与样本均值的差的平方和的均值&#xff1a; 标准差 标准差是数值分散的测量。 标准差的符号是 σ &#xff08;希腊…

【redis6】第十五章(应用问题解决)

缓存穿透 问题描述 key对应的数据在数据源并不存在&#xff0c;每次针对此key的请求从缓存获取不到&#xff0c;请求都会压到数据源&#xff0c;从而可能压垮数据源。比如用一个不存在的用户id获取用户信息&#xff0c;不论缓存还是数据库都没有&#xff0c;若黑客利用此漏洞…

Yolov5环境部署步骤记录

目录1.Anaconda1.1 虚拟环境1.1.1 虚拟环境手动配置Pytorch库2.Pycharm社区版2.1 Yolov5源码下载2.2 Pycharm设置3. Yolov53.1 安装所需的插件3.2 运行detect.py1.Anaconda 安装&#xff0c;Anaconda3-5.3.1-Windows-X86_64.exe&#xff0c;装好之后&#xff1b; 配置环境变量…

Code:美团代码托管平台的演进与实践

美团代码托管平台经过长期的打磨&#xff0c;完成了分布式架构的改造落地&#xff0c;托管数以万计的仓库&#xff0c;日均Git相关请求达到千万级别。本文主要介绍了美团代码托管平台在迭代演进过程中面临的挑战及解决思路&#xff0c;希望对大家有所帮助或启发。 1. 引言 2. …

六: 数 组(eclipse的使用)

目录复习隐藏eclipse中的工程3.2 一维数组的使用&#xff1a;数组元素的引用p103.2 一维数组的使用&#xff1a;数组元素的默认初始化值p123.2 一维数组的使用p213.2 一维数组的使用p223.3 多维数组的使用p243.3 多维数组的使用p25引用类型的变量&#xff0c;保存的要么是地址值…

国际标准下载的几个网站 请点赞收藏

名称以ITU开头的国际标准下载网站名称以ITU开头的国际标准&#xff0c;是国际电信联盟组织制定的国际标准。国际电信联盟组织简称国际电联。它的官网是http://www.itu.int。 通过在这个网站下输入标准的部门名称就可以搜索下载电信标准。已ITU Q.763为例打开官网输入标准名称点…

C++11 类的新功能

作者&#xff1a;小萌新 专栏&#xff1a;C进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍C11类的新功能和一些关键字 类的新功能类的新功能默认成员函数类成员变量的初始化C11新关键字defaultdeletefinaloverride类的新功…

Java poi之Excel文本图片内容提取

目录结构前言文档准备引入Maven依赖代码块提取结果验证excel03.xls 提取结果excel07.xlsx 提取结果前言 应公司需求&#xff0c;需实现以下功能 Excel文本内容的替换&#xff1b;Excel文本内容的提取&#xff1b;Excel中图片的提取存放 此文章将使用Apache POI实现Excel文件…

我问 ChatGPT:怎样成为优秀的架构师?看它怎么回答的……

要成为一名优秀的架构师,需要以下几个方面的努力: 1. 系统的学习计算机科学和工程相关的知识,如计算机网络,数据结构,算法,操作系统等。 2. 实践和经验积累。参与许多实际的项目,不断积累经验,提高解决问题的能力。 3. 持续学习和追求卓越。保持对新技术和趋势的敏锐观…

Docker容器 01

前言 1.1 从环境配置说起 环境配置是软件开发的一大难题。开发、测试及运维人员需要相同的代码运行环境&#xff0c;如此一来就需要多次搭建环境&#xff0c;想想就觉得麻烦&#xff0c;实际上&#xff0c;在不了解docker等容器技术以前&#xff0c;还真就是这么干的&#xff…

IDEA 中动态web 工程的操作

目录a)IDEA 中如何创建动态web 工程1、创建一个新工程exer&#xff1a;2、在exer下创建module&#xff1a;test3、动态web工程创建成功 如下图b)Web 工程的目录介绍c)如何给动态 web 工程添加额外jar 包1 添加lib目录2 将jar包复制到lib目录中3 将jar包添加到工程4 可以打开项目…

西湖论剑2022部分misc

文章目录签到题喵take_the_zip_easymp3机你太美签到题喵 把文件尾的16进制复制出来&#xff0c;再转换字符串 私信后台即可获得flag take_the_zip_easy 明文攻击 echo -n “dasflow.pcapng” > 1.txt time ./bkcrack -C zipeasy.zip -c dasflow.zip -p 1.txt -o 30 -x 0…

六类网线为啥那么受欢迎,网络工程师必知

目前&#xff0c;国内千兆网络已大规模普及&#xff0c;从前的“销冠”百兆超五类网线已经渐渐淡出了人们的视野&#xff0c;已然被千兆的六类网线取代成为现代布线入门级主力军。万兆超六类网线也同时是城市智能化5G、万物互联时代入门首选&#xff0c;各自顺应时代成为不同领…

APP在Google Play上架被拒的原因

即便了解了Google Play商店的相关政策和应用指南&#xff0c;我们也不能避免应用在上架时或者是应用在更新时被拒的情况发生。那今天我们就展开讲讲Google Play商店被拒的原因及解决方案。 出现不当言论或内容&#xff08;比如&#xff0c;色情内容&#xff0c;带有种族歧视和…

基于Springboot搭建java项目(三十五)—— Ngnix配置的使用

Ngnix配置的使用 一、Nginx配置文件(nginx.conf) 1、配置文件的层级 配置文件目前分为三大部分&#xff0c;全局块、event块和http块&#xff0c;下面是具体的结构 2、配置文件概览 # 全局快 ---------------------------------------------------------------------------…