大数据处理从零开始————10.MapReduce编程实践之统计历年最高温度

news2024/11/25 8:18:26

1.项目目标

1.1 需求概述

        现在我们想统计历年来的最高温度,要从给定的数据中,计算每一年的最高温度是多少。

1.2 业务分析

        要统计给定格式数据中每一年的最高温度,可以使用MapReduce编写一个Hadoop来处理该数据。

        Mapper类将提取每一行数据中的年份和温度信息,并输出为键值对,其中键是年份,值是温度。

        Reducer类用于找到每年记录中的最高温度。

        驱动程序将设置作业的输入格式、输出格式、Mapper和Reducer类,并启动作业。

 2. 新建项目

        如果没有进行配置项目,则需要先进行配置,可以参考下文的前半部分:

大数据处理从零开始————8.基于Java构建WordCount项目-CSDN博客

        如果配置好就可以直接进行下一步。新建项目后,确定好项目的名称,组ID,工作ID的信息。

        打开pom.xml文件,添加项目配置,添加如下配置。

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <!--<scope>test</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.3.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.3.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>3.3.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
    </dependencies>
pom.xml文件

        如果pom.xml全部标红可以看上一节解决方法,完全相同。

3.完善项目代码

3.1 创建Mapper类

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 java.io.IOException;

/**
 * 0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF108991999999999999999999
 * 从给定的数据中,计算每一年的最高温度是多少
 * 温度数据的说明:
 * 1. 每行数据的 [15,18] 位是年份
 * 2. 每行的第87个字符,代表温度的符号(正负)
 * 3. 每行的第 [88,91] 位代表温度的值,如果温度是9999代表无效温度
 * 4. 每行的第92位是一个校验位,如果是0,1,4,5,9代表有效温度
 */
public class TempratureMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    private Text k2;
    private IntWritable v2;

    @Override
    protected void setup(Context context) throws IOException, InterruptedException {
        k2 = new Text();
        v2 = new IntWritable();
    }

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        // 需要处理的逻辑:
        // 1.从字符串中解析出来每一个需要的数据:年份、温度、校验
        // 2.将年份作为K2,将温度作为V2,写出到环形缓冲区中
        String line = value.toString();
        // 1.获取年份
        String year = line.substring(15, 19);
        // 2.获取温度
        int temprature = Integer.parseInt(line.substring(87, 92));
        // 3.获取校验位
        String check = line.substring(92, 93);

        // 4.验证温度是否是一个合法的温度
        if (Math.abs(temprature) == 9999 || check.matches("[^01459]")) {
            // 表示不合法的温度
            return;
        }

        // 5.所有的校验都没问题了,将年份和温度写出
        k2.set(year);
        v2.set(temprature);
        context.write(k2, v2);
    }
}
Mapper类

3.2 实现Reducer类

package com.jyd;

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

import java.io.IOException;

public class TempratureReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable v3;

    @Override
    protected void setup(Context context) throws IOException, InterruptedException {
        v3 = new IntWritable();
    }

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {

        int maxTemperature = Integer.MIN_VALUE;  // 设定一个初始的最低温度

        // 遍历所有的温度值,找到最大值
        for (IntWritable value : values) {
            maxTemperature = Math.max(maxTemperature, value.get());
        }

        // 设置最后的结果
        v3.set(maxTemperature);
        // 将年份和其对应的最大温度输出
        context.write(key, v3);

    }
}
Reducer类

3.3 构建驱动器Driver类

package com.jyd;

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

/**
 * K1: 行偏移量
 * V1: 行记录
 *
 * K2: 年份,Text、IntWritable
 * V2: 温度,IntWritable
 *
 * K3: 年份,Text、IntWritable
 * V3: 温度,IntWritable
 */
public class TempratureDriver {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        System.setProperty("HADOOP_USER_NAME", "root");
        Configuration configuration = new Configuration();
        Job job = Job.getInstance(configuration);
        job.setJarByClass(TempratureDriver.class);
        job.setMapperClass(TempratureMapper.class);
        job.setReducerClass(TempratureReducer.class);
        job.setCombinerClass(TempratureReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}
Driver类

4.运行程序

        首先给程序打包。

打包

        上传到hadoop。

上传

                

        启动hadoop,并将程序上传到hadoop中。

./myhadoop.sh start 启动hadoop
cd /user/local/data     #转到文件夹下
vim temp #创立测试文件
hdfs dfs -put temp /sy/temp  #将temp上传到/sy/temp中

        注意:我这里有/sy,如果没有的话,应该先用下面命令创建/sy

        hdfs dfs mkdir /sy  #在hadoop下创建一个cs文件。

        temp测试文件内容如下:

0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF108991999999999999999999999  
0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9+01231+99999102001ADDGF108991999999999999999999  
0029029070999991910010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9+01501+99999102001ADDGF108991999999999999999999  
0029029070999991910010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00231+99999102001ADDGF108991999999999999999999  
0029029070999991920010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9+02451+99999102001ADDGF108991999999999999999999

       

temp文件

        运行jar包:hadoop jar jyd.jar com.jyd.TempratureDriver /sy/temp /tempoutput

运行

        查看结果:hdfs dfs -cat /tempoutput/part-r-00000

查看结果

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

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

相关文章

使用Milvus和Llama-agents构建更强大的Agent系统

代理&#xff08;Agent&#xff09;系统能够帮助开发人员创建智能的自主系统&#xff0c;因此变得越来越流行。大语言模型&#xff08;LLM&#xff09;能够遵循各种指令&#xff0c;是管理 Agent 的理想选择&#xff0c;在许多场景中帮助我们尽可能减少人工干预、处理更多复杂任…

【模型】Encoder-Decoder模型中Attention机制的引入

在 Encoder-Decoder 模型中引入 Attention 机制&#xff0c;是为了改善基本Seq2Seq模型的性能&#xff0c;特别是当处理长序列时&#xff0c;传统的Encoder-Decoder模型容易面临信息压缩的困难。Attention机制可以帮助模型动态地选择源序列中相关的信息&#xff0c;从而提高翻译…

06-ArcGIS For JavaScript-requestAnimationFrame动画渲染

文章目录 概述setInterval&#xff08;&#xff09;与setTimeout()requestAnimationFrame()requestAnimationFrame在ArcGIS For JavaScript的应用结果 概述 本节主要讲解与时间相关的三个方法setTimeout()、setInterval()和requestAnimationFrame()&#xff0c;这三个方法都属…

怎样提高员工效率与客户转化率?

在当今商业竞争日益激烈的市场环境中&#xff0c;企业越来越注重提升员工的工作效率和客户的转化率。以下是几种高效的策略&#xff0c;可以帮助企业激发新的业务活力&#xff1a; 1、自动快捷回复消息 自动快捷回复功能&#xff0c;是提升客户沟通效率的有力工具。通过设置自…

注册电气工程师印章要求

一、边框 1.尺寸&#xff1a;长63mm、宽28mm、线宽&#xff1a;0.6mm 2.第一格&#xff1a;宽7.25mm 3.第二格&#xff1a;宽19.2mm 二、文字 1.第一行 名称&#xff1a;行长59.50mm 字高5.61mm 字体 宋体 2.第二行 姓名&#xff1a;行长42.00mm 字高5.28mm 字体 姓名 宋体 人名…

GStreamer 简明教程(六):利用 Tee 复制流数据,巧用 Queue 实现多线程

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline GStreamer 简明教程&#xff08;三…

超声波清洗机靠谱吗?适合学生党入手的四款眼镜清洗机品牌推荐!

有没有学生党还不知道双十一买什么&#xff1f;其实可以去看看超声波清洗机&#xff0c;说实话它的实用性真的很高&#xff0c;对于日常用于清洗眼镜真的非常合适&#xff0c;不仅可以帮助大家节约时间而且还能把眼镜清洗的干净透亮&#xff0c;接下来我就来为大家带来四款好用…

浅谈钓鱼攻防之道-制作免杀word文件钓鱼

梦里明明有六趣&#xff0c;觉后空空无大千 1、制作基本的word宏文件 Cobalt Strike生成宏代码 选择监听器 成功生成宏文件 新建word文档&#xff0c;点击视图——宏——查看宏 选择编辑 点击视图中的工程资源管理器 选择本文件中ThisDocument&#xff0c;将cs生成的文件复制…

MySql表结构设计

创建 create table 表名(字段1 字段类型 [约束] [comment 字段1注释],...) [comment 表注释];约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。它的目的是保证数据库中数据的正确性、有效性和完整性。 约束描述关键字非空约束限制该字段不能为nullnot nu…

某宝228滑块和普通228滑块之间的区别

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关。 本文章未经许可禁止转载&#xff0c;禁止任何修改后二次传播&#xff0c;擅自使用本文讲解的技术而导致的任何意外&#xff…

C++11 新特性 学习笔记

C11 新特性 | 侯捷C11学习笔记 笔者作为侯捷C11新特性课程的笔记进行记录&#xff0c;供自己查阅方便 文章目录 C11 新特性 | 侯捷C11学习笔记1.Variadic TemplatesC11支持函数模板的默认模板参数C11在函数模板和类模板中使用可变参数 可变参数模板1) 可变参数函数模板2) 可变…

Spring Boot 项目中 Redis 与数据库性能对比实战:从缓存配置到时间分析,详解最佳实践

一、前言&#xff1a; 在现代应用中&#xff0c;随着数据量的增大和访问频率的提高&#xff0c;如何提高数据存取的性能变得尤为重要。缓存技术作为一种常见的优化手段&#xff0c;被广泛应用于减少数据库访问压力、提升系统响应速度。Redis 作为一种高效的内存缓存数据库&…

DBeaver连接mysql 9报错:Public Key Retrieval is not allowed

DBeaver连接mysql 9报错&#xff1a;Public Key Retrieval is not allowed 如图&#xff1a; 解决方案 编辑连接属性&#xff1a; 修改 allowPublicKeyRetrieval 的值为 true DBeaver连接mysql数据库执行.sql脚本&#xff0c;Windows_dbeaver执行sql脚本.sql文件-CSDN博客文章…

【Java】 —— 数据结构与集合源码:Vector、LinkedList在JDK8中的源码剖析

目录 7.2.4 Vector部分源码分析 7.3 链表LinkedList 7.3.1 链表与动态数组的区别 7.3.2 LinkedList源码分析 启示与开发建议 7.2.4 Vector部分源码分析 jdk1.8.0_271中&#xff1a; //属性 protected Object[] elementData; protected int elementCount;//构造器 public …

2024ccna考试时间?新手小白看这些就够了

2024年想要考取ccna证书的新手小白们&#xff0c;是不是正在为考试时间而烦恼呀&#xff0c;其实ccna的考试时间其实非常灵活&#xff0c;并不需要像其他考试那样死记硬背固定的日期。那么小编马上就给大家说说2024ccna考试时间&#xff0c;并且附带一些考试内容&#xff0c;让…

LeetCode[简单] 70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路 利用滚动数组 public class Solution {public int ClimbStairs(int n) { //滚动数组int f0 0, f1 0, f2 1;for(int i 1; i < n; i){…

拱坝与重力坝:结构特性与应用差异的深度解析

在水利工程领域&#xff0c;坝体结构的选择对于工程的稳定性、安全性以及经济效益具有至关重要的影响。拱坝与重力坝作为两种主要的坝型&#xff0c;各自具有独特的结构特性和应用场景。本文旨在深入探讨拱坝与重力坝的区别&#xff0c;从工程特点、坝体结构型式、材料选用、水…

国内如何下载谷歌浏览器(chrome浏览器)历史版本和chromedriver驱动,长期更新,建议收藏

众所周知&#xff0c;google是一直被国内屏蔽的&#xff0c;有时候想要下载个chrome浏览器都要去外网&#xff0c;或者到处去搜索才能下载到。因为下载chrome浏览器的这个网址&#xff1a;google.com/chrome/ 在国内是一直被屏蔽掉的。 今天主要讲解的是国内ChromeDriver 的下…

ET实现游戏中的红点提示系统(服务端)

目录 ☝&#x1f913;前言 ☝&#x1f913;一、实现思路 ☝&#x1f913;二、实现 &#x1f920;2.1 定义红点组件 &#x1f920;2.2 定义Proto消息体 &#x1f920;2.3 RedPointComponentSystem ☝&#x1f913;难点 ☝&#x1f913;前言 当我们闲来无事时打开农药想消…

数据结构-5.3.二叉树的定义和基本术语

一.二叉树的基本概念&#xff1a; 树是一种递归定义的数据结构&#xff0c;因此二叉树是递归定义的数据结构。 二.二叉树的五种状态&#xff1a; 三.几个特殊的二叉树&#xff1a; 1.满二叉树&#xff1a;结点总数就是通过等比数列公式求出来的&#xff0c;首项为1即根节点&a…