使用Hadoop分析气象数据完整版(附带完整代码)_hadoop气象数据分析

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

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 中断,然后再次输入命令即可。

我就下载了下面这么多,共计78429条。
在这里插入图片描述

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 合并数据

数据很分散,合并数据:
zcat 2019/*.gz > data.txt

到此数据获取完毕。

2 MapReduce处理数据

2.1 环境配置,启动集群

详情跳转到 : 大数据学习系列:Hadoop3.0苦命学习(一),本文不再赘述。

2.2 上传到HDFS

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

执行截图:
在这里插入图片描述
去控制台查看一下是否成功:

在这里插入图片描述

2.2 编写MapReduce代码

2.2.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.2.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.2.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.3 执行

2.3.1 打包、上传

老套路,不说了。

2.3.2 运行

hadoop jar temperature_test-1.0-SNAPSHOT.jar cn.sky.hadoop.JobMain
执行结果:
在这里插入图片描述
在这里看一眼数据:
在这里插入图片描述
嗯,还行。

3 导入数据到Hive

Hive详情过程,请参考:大数据学习系列:Hadoop3.0苦命学习(五)

有个问题,若直接从HDFS导入数据到Hive,HDFS上的数据会丢失。

所以我将数据下载下来,重命名为 temperature_data ,并上传到 node03
在这里插入图片描述
数据有了,开始创建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数据分析

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

  1. 查询2019全年平均温度
    select avg(t_avg) from temperature;

哇,太慢了,查了25秒,最终结果是3.46(因为数据是被放大了10倍)左右
在这里插入图片描述

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

csdnimg.cn/20200527092811353.png)

[外链图片转存中…(img-VlvYNj2T-1715402287639)]
[外链图片转存中…(img-vr5eufLS-1715402287639)]
[外链图片转存中…(img-qjqSAt72-1715402287639)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于Hadoop气象数据分析是利用Hadoop平台进行大规模、高效、并行处理气象数据的一种方法。Hadoop是一个开源的分布式计算框架,可以处理大型数据集并提供高可靠性和高吞吐量。在气象数据分析中,Hadoop可以提供以下优势: 1. 处理大量数据:气象数据通常非常庞大,包含大量的观测数据、模型输出和卫星遥感数据等。Hadoop可以将这些数据分割成小块,并在集群中并行处理,以加速数据处理速度。 2. 并行处理:Hadoop的并行处理能力使得气象数据可以同时在多个节点上进行处理,从而节省时间和资源。例如,可以同时计算多个气象变量的平均值或统计数据。 3. 容错性:Hadoop具有高度的容错性,即使某个节点出现故障,也不会影响整个计算任务的进行。这对于气象数据分析来说是至关重要的,因为数据集通常非常庞大,故障可能会导致数据处理的中断和重复。 4. 扩展性:Hadoop的集群可以根据需要进行扩展,以处理不断增长的气象数据量。这使得气象数据分析能够随着数据规模的增加而不断提高处理能力。 5. 数据挖掘和机器学习Hadoop可以与其他数据挖掘和机器学习工具集成,例如Apache Spark和TensorFlow等,以便更深入地分析气象数据并发现隐藏的规律。 综上所述,基于Hadoop气象数据分析能够处理大量数据、并行处理、具备高度容错性和可扩展性,并可以结合其他数据挖掘和机器学习技术,为气象学研究和应用提供强大的支持。 ### 回答2: 基于Hadoop气象数据分析是指利用Hadoop平台进行气象数据的存储、处理和分析Hadoop是一个开源的高性能分布式计算平台,具有良好的扩展性和容错性,非常适合处理大规模的数据集。气象数据分析的目的是从大量的气象观测数据中提取有价值的信息,为气象预测、气候研究以及灾害预警等提供支持。 首先,对于大规模的气象数据Hadoop提供了分布式文件系统HDFS,能够高效地存储和管理数据。气象观测数据可以通过Hadoop集群的数据节点进行分布式存储,保证数据的可扩展性和冗余备份,防止数据丢失。 其次,Hadoop的计算框架MapReduce可以用于并行处理气象数据。通过编写MapReduce程序,可以对海量的气象数据进行分布式计算,包括数据过滤、清洗、聚合、统计等。例如,可以使用MapReduce计算某个时间段内的平均气温、最高风速等统计信息,以及不同地区的降水量、温度分布等情况。 另外,Hadoop生态系统中的其他工具也可以用于气象数据分析。例如,使用Hive可以进行数据的查询和分析使用Pig可以进行数据的清洗和转换,使用Spark可以进行复杂的数据处理和机器学习算法。 基于Hadoop气象数据分析具有以下优势:首先,能够高效地处理大规模的气象数据,提高数据分析的效率;其次,具有良好的扩展性和容错性,可以应对数据量的快速增长和硬件故障;此外,Hadoop的开源性和社区支持,为气象数据的处理和分析提供了丰富的工具和算法。 综上所述,基于Hadoop气象数据分析可以提高对大规模气象数据的处理和分析能力,为气象预测和气候研究等领域提供有力支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值