MapReduce计算广州2022年每月最高温度

news/2024/11/15 4:28:27/

目录

数据集

1.查询地区编号

2.数据集的下载

编写MapReduce程序输入格式

输出格式

Mapper类

确定参数

代码

Reducer类

思路

代码

Runner类

运行结果


数据集

1.查询地区编号

NCDC是美国国家气象数据中心的缩写,是一个负责收集、存储和分发全球气象和气候数据的组织。

我们通过NCDC查询地区对应的编号,参考这里。

2.数据集的下载

打开资源管理器并输入路径:

ftp://ftp.ncdc.noaa.gov/pub/data/noaa/isd-lite/

打开目录 "2022",查询编号(比如广州="592870"),找到文件 "592870-9999-20222.gz"复制到本地即可。

通过解压工具解压得到文件"592870-9999-20222",修改后缀为txt。

 

注意这里的温度都是经过*10后的格式!

编写MapReduce程序
输入格式

2022 01 01 00   107    99 10265   339    11 -9999 -9999 -9999
2022 01 01 01   150   100 -9999 -9999    10 -9999 -9999 -9999
2022 01 01 02   160   100 -9999 -9999    10 -9999 -9999 -9999
2022 01 01 03   176   100 10270   354    20 -9999 -9999 -9999
2022 01 01 04   190    80 -9999 -9999    10     0 -9999 -9999
2022 01 01 05   210    80 -9999 -9999    20     0 -9999 -9999
2022 01 01 06   216   104 10234    19    11 -9999 -9999 -9999
2022 01 01 07   220   100 -9999 -9999    10 -9999 -9999 -9999
2022 01 01 08   210    90 -9999   270    20 -9999 -9999 -9999
2022 01 01 09   211   108 10229   331    25 -9999 -9999 -9999
2022 01 01 10   190    90 -9999   340    50 -9999 -9999 -9999
2022 01 01 11   190    90 -9999   340    50 -9999 -9999 -9999
...共8700行数据

输出格式

01  260
02  360
03  310
...共12行数据

 

Mapper类

确定参数

  • KEY_IN:使用默认的TextInputFormat,所以 KEY_IN 为每一行的字节偏移量 ,为LongWritable类型。
  • VALUE_IN:使用默认的TextInputFormat,所以 VALUE_IN为对应的一行文本,为Text型。
  • KEY_OUT:我们统计每个月的最高温度,所以以月份为map函数输出的键 KEY_IN,为Text型。
  • VALUE_OUT:每一行数据中的温度作为map函数输出的值,为 IntWritable型。

代码

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.util.StringUtils;
import org.checkerframework.checker.units.qual.K;import java.io.IOException;public class MaxTempMapper extends Mapper<LongWritable, Text,Text, IntWritable> {private Text KEY_OUT = new Text();private IntWritable VALUE_OUT = new IntWritable();@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//获得数据行String line = value.toString();System.out.println(line);//转为数组String[] words = StringUtils.split(line,' ');//获取月份String month = words[1];//获取温度String temp = line.substring(16,19);temp = temp.trim();System.out.println(month+"    "+temp);//设置输出的 键和值KEY_OUT.set(month);VALUE_OUT.set(Integer.parseInt(temp));//写出context.write(KEY_OUT,VALUE_OUT);}
}

Reducer类

map函数的输出键值对即为reduce函数的输入键值对,所以:4

KEY_IN:Text类型。
VALUE_IN:IntWritable型。

KEY_OUT:Text型。

VALUE_OUT:IntWritable型。

思路

因为每个reduce方法每次处理的都是同一KEY(同一个月)的键值对,我们只需要定义一个变量maxTmp来不断更新最大的温度值即可。

代码

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class MaxTempReducer extends Reducer<Text, IntWritable,Text,IntWritable> {private IntWritable OUT_VALUE = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int maxTemp = Integer.MIN_VALUE;for (IntWritable value : values) {maxTemp = Math.max(value.get(),maxTemp);}//设置输出值OUT_VALUE.set(maxTemp);//写出context.write(key,OUT_VALUE);}
}

Runner类

注意:输出目录不可存在!

import com.lyh.mapreduce.conbineTextInputFormat.WordCountMapper;
import com.lyh.mapreduce.conbineTextInputFormat.WordCountReducer;
import com.lyh.mapreduce.conbineTextInputFormat.WordCountRunner;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;public class MaxTempRunner extends Configured implements Tool {public static void main(String[] args) throws Exception {ToolRunner.run(new Configuration(),new MaxTempRunner(),args);}@Overridepublic int run(String[] args) throws Exception {//1.获取jobConfiguration conf = new Configuration();Job job = Job.getInstance(conf, "max temperature count");//2.配置jar包路径job.setJarByClass(MaxTempRunner.class);//3.关联mapper和reducerjob.setMapperClass(MaxTempMapper.class);job.setReducerClass(MaxTempReducer.class);//4.设置map、reduce输出的k、v类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);//5.设置统计文件输入的路径,将命令行的第一个参数作为输入文件的路径FileInputFormat.setInputPaths(job,new Path("D:\\MapReduce_Data_Test\\temperature\\input"));//6.设置结果数据存放路径,将命令行的第二个参数作为数据的输出路径FileOutputFormat.setOutputPath(job,new Path("D:\\MapReduce_Data_Test\\temperature\\output"));return job.waitForCompletion(true) ? 0 : 1;//verbose:是否监控并打印job的信息}
}

运行结果
 

01	260
02	260
03	310
04	330
05	350
06	370
07	400
08	380
09	370
10	370
11	320
12	220


http://www.ppmy.cn/news/72564.html

相关文章

神经网络:Zero2Hero 3 - Tanh、Gradient、BatchNormal

Zero2Hero : 3 - Tanh、Gradient、BatchNormal 接上篇&#xff0c;对MLP模型有进一步进行了修改&#xff0c;增加BatchNormal、和激活函数。深入研究深层网络的内部&#xff0c;激活、反向传递梯度以及随机初始化的陷阱。BatchNormal的作用。 import torch import torch.nn.f…

HQL语法

HQL基础语法 Hive中的语句叫做HQL语句,是一种类似SQL的语句,基本上和SQL相同但是某些地方也是有很大的区别. 数据库操作 创建数据库 1.创建一个数据库,数据库在HDFS上的默认存储路径是/hive/warehouse/*.db。 create database hive01; 避免要创建的数据库已经存在错误&…

网络安全前景怎么样?怎么自学?看这一篇就够了

一、网络安全前景 网络安全行业细分岗位比较多&#xff0c;目前需求量比较大的几类网络安全岗位有渗透测试、安全运维、等保测评等&#xff0c;在岗位需求量和薪资待遇方面都比较可观。 这时很多人就会问&#xff0c;网络安全人才需求量这么大&#xff0c;进入行业的人就会越来…

学会“放弃与妥协”,学会“自我牺牲”,学会“善待痛苦”

不放弃旧的&#xff0c;就难以得到新的&#xff1b;不放弃固有的&#xff0c;就难以得到未有点&#xff1b;不放弃渺小的&#xff0c;就难以得到硕大的&#xff1b;不放弃已知的&#xff0c;就难以得到未知的。————生活的妙趣就在于此。关键就在于&#xff1a;于大处着眼&a…

(13)ADDA

AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号&#xff0c;ADC模拟-数字转换器 DA&#xff08;Digital to Analog&#xff09;&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换…

全局钩子的安全退出

背景 最近在写一个鼠标检测工具&#xff0c;需要记录鼠标的按键、滚轮和回报率等信息。 使用方法 使用鼠标全局钩子&#xff0c;捕获鼠标的信息。 具体实现逻辑 1、创建线程&#xff1b; 2、在线程中&#xff0c;注册全局鼠标钩子&#xff1b; 3、鼠标消息捕获&#xff1b…

flink cdc 用mybatis-plus写到mysql5.6

背景 项目中需要做一个数据同步的功能, 在方案对比中,canal 与flink cdc 都有尝试。 起初在网上找的flink例子,要么只能支持mysql5.7以上版本,要么就是需要序列化各种bug,比如就不能直接使用 @Autowired xxxServer 来调用数据库层面的注入,getBaseMapper()为空 因为目…

vue项目封装svg组件

使用阿里巴巴 iconfont 官网提供的图标 下载图片格式的&#xff0c;宽高变化的时候&#xff0c;图片会失真。最好使用svg格式的&#xff0c;自适应还保真且可以调整样式。但是每次使用一个图片&#xff0c;下载并导入文件中使用实在是太麻烦。下面配合使用svg-sprite-loader 包…