任务14:使用MapReduce提取全国每年最低/最高气温

任务描述

知识点

  • 使用MapReduce提取数据

重 点

  • 开发MapReduce程序
  • 统计每年每个月的最低气温
  • 统计每年每个月的最高气温

内 容

  • 使用IDEA创建一个MapReduce项目
  • 开发MapReduce程序
  • 使用MapReduce统计每年每个月的最低气温
  • 使用MapReduce统计每年每个月的最高气温

任务指导

1. 使用MapReduce提取最低气温

  • 使用IDEA创建Maven项目:TemperatureDemo
  • 在Settings中配置Maven
  • 配置pom.xml文件
  • 开发MapReduce程序
    • com.MinTemperatureMapper:提取日期和气温数据
    • com.MinTemperatureReducer:提取其中的最低温度,由于气温数据的膨胀因子为10,也就是说是原始数据的10倍,因此需要将获取的气温数据除以10
    • com.MinTemperature:MapReduce程序主入口
  • 程序编写完成,右键MinTemperature,点击Run 'MinTemperature.main()'运行MapReduce程序
  • 程序运行完成,进入master机器,查看运行结果

2. 使用MapReduce提取最高气温

  • 开发MapReduce程序
    • com.MaxTemperatureMapper:提取日期和气温数据
    • com.MaxTemperatureReducer:提取其中的最高温度,由于气温数据的膨胀因子为10,也就是说是原始数据的10倍,因此需要将获取的气温数据除以10
    • com.MaxTemperature:MapReduce程序主入口
  • 程序编写完成,右键MaxTemperature,点击Run 'MaxTemperature.main()'运行MapReduce程序
  • 程序运行完成,进入master机器,查看运行结果

任务实现

1. 使用MapReduce提取最低气温

  • 使用IDEA创建Maven项目:TemperatureDemo
  • 在Settings中配置Maven
  • 配置pom.xml文件,内容如下:

    <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.9.2</version> </dependency> </dependencies>

程序是一个典型的MapReudce程序结构,主要包括三个类,分别为:MinTemperatureMapper.java(Map程序)、MinTemperatureReducer.java(Reduce程序)、MinTemperature.java(Driver驱动类)。

程序的作用是将前面ETL后的天气数据进行提取数据操作,抽取出22年内的每个月的最低温度,并保存到HDFS。

  • Map端:提取日期和气温数据

  • 在项目的src/main/java/com包中创建一个类MinTemperatureMapper.java,内容如下:

    package com;

    import org.apache.hadoop.io.FloatWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;

    import java.io.IOException;

    public class MinTemperatureMapper extends Mapper<LongWritable, Text,Text, FloatWritable> {
    private static final int MISSING = -9999;
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    String line = value.toString();
    if (!"".equals(line)) {
    String[] values = line.split(",");
    // 获取年份
    String year = values[1];
    // 获取月份
    String month = values[2];
    // 拼接年份和月份,作为输出key
    String textKey = year + "-" + month;
    // 获取气温数据
    float temp = Float.parseFloat(values[5]);
    if (temp != MISSING) {
    System.out.println(textKey+":"+temp);
    context.write(new Text(textKey), new FloatWritable(temp));
    }
    }

    复制代码
      }

    }

  • Reduce端:Reduce获取到Map端的输出,例如:<2000-01,list[-121,-32,-53,51........]>,将同一个月份的气温数据整合到一个list列表中,提取其中的最低温度,由于气温数据的膨胀因子为10,也就是说是原始数据的10倍,因此需要将获取的气温数据除以10。

  • 在项目的src/main/java/com包中创建一个类MinTemperatureReducer.java,内容如下:

    package com;

    import org.apache.hadoop.io.FloatWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;

    import java.io.IOException;

    public class MinTemperatureReducer extends Reducer<Text, FloatWritable,Text,FloatWritable> {
    @Override
    protected void reduce(Text key, Iterable<FloatWritable> values, Context context) throws IOException, InterruptedException {

    复制代码
          float minValue = Float.MAX_VALUE;
    
          for (FloatWritable value : values) {

    // 获取最低温度
    minValue = Math.min(minValue, value.get());
    }

    // 气温数据的膨胀因子为10,需要将获取的气温数据除以10
    float air = minValue/10;

    复制代码
          context.write(key,new FloatWritable(air));
      }

    }

  • Driver端:MapReduce程序的驱动类

  • 在项目的src/main/java/com包中创建一个类MinTemperature.java,内容如下:

    package com;

    import java.io.IOException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.FloatWritable;
    import org.apache.hadoop.io.Text;
    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.hadoop.util.GenericOptionsParser;

    public class MinTemperature {
    public static void main(String[] args) {
    Configuration conf = new Configuration();

    复制代码
          Job job = null;
          try {
              job = Job.getInstance(conf);
              job.setJarByClass(MinTemperature.class);
              job.setJobName("Min temperature");
              job.setMapperClass(MinTemperatureMapper.class);
              job.setReducerClass(MinTemperatureReducer.class);
              job.setMapOutputKeyClass(Text.class);
              job.setMapOutputValueClass(FloatWritable.class);
              job.setOutputKeyClass(Text.class);
              job.setOutputValueClass(FloatWritable.class);
    
              FileInputFormat.addInputPath(job,new Path("hdfs://master:9000/china_all/"));
              FileOutputFormat.setOutputPath(job,new Path("hdfs://master:9000/output/mintemp/"));
    
              System.exit(job.waitForCompletion(true) ? 0 : 1);

    // job.submit();
    } catch (IOException e) {
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }

  • 程序编写完成,右键MinTemperature,点击Run 'MinTemperature.main()'运行MapReduce程序

  • 控制台输出:

  • 程序运行完成,进入master机器,查看运行结果

    hadoop fs -ls /output/mintemp

复制代码
# hadoop fs -cat /output/mintemp/part-r-*

2. 使用MapReduce提取最高气温

程序同样是一个典型的MapReudce程序结构,主要包括三个类,分别为:MaxTemperatureMapper.java(Map程序)、MaxTemperatureReducer.java(Reduce程序)、MaxTemperature.java(Driver驱动类)。

程序的作用是将前面ETL后的天气数据进行提取数据操作,抽取出22年内的每个月的最高温度,并保存到HDFS。

  • Map端:提取日期和气温数据

  • 在TemperatureDemo项目的src/main/java/com包中创建一个类MaxTemperatureMapper.java,内容如下:

    package com;

    import org.apache.hadoop.io.FloatWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;

    import java.io.IOException;

    public class MaxTemperatureMapper extends Mapper<LongWritable, Text,Text, FloatWritable> {
    private static final int MISSING = -9999;
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    String line = value.toString();
    if (!"".equals(line)) {
    String[] values = line.split(",");
    // 获取年份
    String year = values[1];
    // 获取月份
    String month = values[2];
    // 拼接年份和月份,作为输出key
    String textKey = year + "-" + month;
    // 获取气温数据
    float temp = Float.parseFloat(values[5]);
    if (temp != MISSING) {
    System.out.println(textKey+":"+temp);
    context.write(new Text(textKey), new FloatWritable(temp));
    }
    }

    复制代码
      }

    }

  • Reduce端:Reduce获取到Map端的输出,例如:<2000-01,list[-121,-32,-53,51........]>,将同一个月份的气温数据整合到一个list列表中,提取其中的最高温度,由于气温数据的膨胀因子为10,也就是说是原始数据的10倍,因此需要将获取的气温数据除以10。

  • 在项目的src/main/java/com包中创建一个类MaxTemperatureReducer.java,内容如下:

    package com;

    import org.apache.hadoop.io.FloatWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;

    import java.io.IOException;

    public class MaxTemperatureReducer extends Reducer<Text, FloatWritable,Text,FloatWritable> {
    @Override
    protected void reduce(Text key, Iterable<FloatWritable> values, Context context) throws IOException, InterruptedException {

    复制代码
          float maxValue = Float.MIN_VALUE;
    
          for (FloatWritable value : values) {

    // 获取最高温度
    maxValue = Math.max(maxValue, value.get());
    }

    复制代码
          //     气温数据的膨胀因子为10,需要将获取的气温数据除以10
          float air = maxValue/10;
    
          context.write(key,new FloatWritable(air));
      }

    }

  • Driver端:MapReduce程序的驱动类

  • 在项目的src/main/java/com包中创建一个类MaxTemperature.java,内容如下:

    package com;

    import java.io.IOException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.FloatWritable;
    import org.apache.hadoop.io.Text;
    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.hadoop.util.GenericOptionsParser;

    public class MaxTemperature {
    public static void main(String[] args) {
    Configuration conf = new Configuration();

    复制代码
          Job job = null;
          try {
              job = Job.getInstance(conf);
              job.setJarByClass(MaxTemperature.class);
              job.setJobName("Max temperature");
              job.setMapperClass(MaxTemperatureMapper.class);
              job.setReducerClass(MaxTemperatureReducer.class);
              job.setMapOutputKeyClass(Text.class);
              job.setMapOutputValueClass(FloatWritable.class);
              job.setOutputKeyClass(Text.class);
              job.setOutputValueClass(FloatWritable.class);
    
              FileInputFormat.addInputPath(job,new Path("hdfs://master:9000/china_all/"));
              FileOutputFormat.setOutputPath(job,new Path("hdfs://master:9000/output/maxtemp/"));
    
              System.exit(job.waitForCompletion(true) ? 0 : 1);

    // job.submit();
    } catch (IOException e) {
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }

  • 程序编写完成,右键MaxTemperature,点击Run 'MaxTemperature.main()'运行MapReduce程序

  • 程序运行完成,进入master机器,查看运行结果

    hadoop fs -ls /output/maxtemp

复制代码
# hadoop fs -cat /output/maxtemp/part-r-*
相关推荐
武子康14 小时前
大数据-236 离线数仓 - 会员指标验证、DataX 导出与广告业务 ODS/DWD/ADS 全流程
大数据·后端·apache hive
武子康2 天前
大数据-235 离线数仓 - 实战:Flume+HDFS+Hive 搭建 ODS/DWD/DWS/ADS 会员分析链路
大数据·后端·apache hive
DianSan_ERP2 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
够快云库2 天前
能源行业非结构化数据治理实战:从数据沼泽到智能资产
大数据·人工智能·机器学习·企业文件安全
AI周红伟2 天前
周红伟:智能体全栈构建实操:OpenClaw部署+Agent Skills+Seedance+RAG从入门到实战
大数据·人工智能·大模型·智能体
B站计算机毕业设计超人2 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法
计算机程序猿学长2 天前
大数据毕业设计-基于django的音乐网站数据分析管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
大数据·django·课程设计
B站计算机毕业设计超人2 天前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计
十月南城2 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
中烟创新2 天前
灯塔AI智能体获评“2025-2026中国数智科技年度十大创新力产品”
大数据·人工智能·科技