做demo前需要先搭建Hadoop集群,并且有linux基础,可参考 https://www.cnblogs.com/linyufeng/p/10831240.html

 1.引出问题

  给一串数据,找出每年的每个月温度最高的2天。其中有可能包含着相同的数据。

1949-10-01 14:21:02    34c
1949-10-01 19:21:02    38c
1949-10-02 14:01:02    36c
1950-01-01 11:21:02    32c
1950-10-01 12:21:02    37c
1951-12-01 12:21:02    23c
1950-10-02 12:21:02    41c
1950-10-03 12:21:02    27c
1951-07-01 12:21:02    45c
1951-07-02 12:21:02    46c
1951-07-03 12:21:03    47c
1949-10-01 14:21:02    34c
1949-10-01 19:21:02    38c
1949-10-02 14:01:02    36c
1950-01-01 11:21:02    32c
1950-10-01 12:21:02    37c
1951-12-01 12:21:02    23c

  2.分析

   从肉眼去看,这么几条数据,人工也能很快的得出结果,但如果有几百万条呢?所以采用hadoop的mapReduce框架,mapReduce是一个分布式的离线计算框架,流程分为4步骤split---map---shuffle---reduce。用mapReduce去处理这些数据。处理天气数据所需要使用到的有年和月还有温度,最后输出则是要对应相对应的日。所以创建一个天气类。并且实现writableComparable接口,实现其未实现方法。

   

package com.sjt.mr.tq.demo;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;import org.apache.hadoop.io.WritableComparable;public class MyTQ implements WritableComparable<MyTQ>{private int year;//年private int month;//月private int day;//日private int wd;//温度public int getYear() {return year;}public void setYear(int year) {this.year = year;}public int getMonth() {return month;}public void setMonth(int month) {this.month = month;}public int getDay() {return day;}public void setDay(int day) {this.day = day;}public int getWd() {return wd;}public void setWd(int wd) {this.wd = wd;}@Overridepublic void write(DataOutput out) throws IOException {out.writeInt(year);out.writeInt(month);out.writeInt(day);out.writeInt(wd);}@Overridepublic void readFields(DataInput in) throws IOException {year = in.readInt();month = in.readInt();day = in.readInt();wd = in.readInt();}@Overridepublic int compareTo(MyTQ mytq) {//1980-05-02 34c//比较年是否相同int c1 = Integer.compare(year, mytq.getYear());if(c1==0){//如果相同则比较月份int c2 = Integer.compare(month, mytq.getMonth());if(c2==0){//如果月份相同则比较温度,使得温度降序排序return -Integer.compare(wd, mytq.getWd());}return c2;}return c1;}}

  3.Map阶段

   在map的读入阶段,需要把从split中读取的数据做切割处理,并且让对象进行序列化存入磁盘中。

  

package com.sjt.mr.tq.demo;import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;public class MyMapper extends Mapper<Object, Text, MyTQ, IntWritable>{private MyTQ tqKey=new MyTQ();private IntWritable Tvalue=new IntWritable();//key记录的是偏移量,value为一行的数据
    @Override protected void map(Object key, Text value, Mapper<Object, Text, MyTQ, IntWritable>.Context context)throws IOException, InterruptedException {try {//1980-01-02 18:15:45    34c //根据制表符分割 获得 split[0]=1980-01-02 18:15:45 split[1]=34c String[] splits =value.toString().split("\t");//设值keySimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(splits[0]);Calendar calendar = Calendar.getInstance();calendar.setTime(date);//给tqkey设值
            tqKey.setYear(calendar.get(calendar.YEAR));tqKey.setMonth(calendar.get(calendar.MONTH)+1);tqKey.setDay(calendar.get(calendar.DAY_OF_MONTH));int wd = Integer.parseInt(splits[1].substring(0, splits[1].length()-1));tqKey.setWd(wd);//设值温度
            Tvalue.set(wd);} catch (ParseException e) {// TODO Auto-generated catch block
            e.printStackTrace();}context.write(tqKey, Tvalue);}}

  4.分组比较器

    调用天气对象的分组比较器会造成一条数据一组的现象,因为条件多了一个天气,所以需要自定义分组比较器。

  

package com.sjt.mr.tq.demo;import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
//分组比较
public class MyGroupComparator extends WritableComparator{//调用父类的构造方法public  MyGroupComparator(){super(MyTQ.class,true);}@Overridepublic int compare(WritableComparable a, WritableComparable b) {MyTQ tq1=(MyTQ)a;MyTQ tq2=(MyTQ)b;//先比较年 再比较月int c1 = Integer.compare(tq1.getYear(), tq2.getYear());if(c1==0){return Integer.compare(tq1.getMonth(), tq2.getMonth());}return c1;}
}

  5.Reduce阶段 

  reduce阶段需要对数据进行最后的处理,根据前面的排序只需要取出当前所得结果的前两行就是该年某月中的温度最高的两天,当然也不排除当前数据中只有一条数据是该年某月的,而且还要判断是否存在相同的天的温度是否处于前两行。

package com.sjt.mr.tq.demo;import java.io.IOException;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;public class MyReduce extends Reducer<MyTQ, IntWritable,Text,IntWritable>{private Text key=new Text();private IntWritable value=new IntWritable();@Overrideprotected void reduce(MyTQ mytq, Iterable<IntWritable> values,Reducer<MyTQ, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {int flag=0;//计数int day=0;//储存日期for (IntWritable v : values) {//如果计算为0取第一位的年月日:温度if(flag==0){//设key和value值key.set(mytq.getYear()+"-"+mytq.getMonth()+"-"+mytq.getDay()+":");value.set(mytq.getWd());//给day设值 防止重复天数day=mytq.getDay();flag++;//计数+1
                context.write(key, value);}//如果计数为1且日期不和第一次写出的日期不一致if(flag!=0&&mytq.getDay()!=day){key.set(mytq.getYear()+"-"+mytq.getMonth()+"-"+mytq.getDay()+":");value.set(mytq.getWd());context.write(key, value);break;}}}
}

  6.打包运行

    部分代码省略,可再文章最后查看到项目源代码及数据处理文件。

    并且将打包后的jar包丢入集群,将需要处理的文本储存到hdfs上,命令为:

    

    执行下行命令运行:分析tq.txt文件 MyJob为入口,结果放入output目录下

    

    如果不报错,并且再hdfs的output的目录下出现了下图中的情况说明你成功了。可以对part-r-00000进行下载。

    

    下载的结果如果为下图,则代表运行代码正确。

    

    

  项目源代码及文件路径 https://github.com/shijintao123/Hadoop

  编译报错参考:https://blog.csdn.net/qq_42476731/article/details/90298983

转载于:https://www.cnblogs.com/mangshebaotang/p/10894410.html

使用mapReduce分析简单天气数据相关推荐

  1. Hadoop实战系列之MapReduce 分析 Youtube视频数据

    Hadoop实战系列之MapReduce 分析 Youtube视频数据 一.实战介绍 MapReduce 是 Hadoop 的计算框架. 在运行一个 MR 程序时,任务过程被分为两个阶段:Map 阶段 ...

  2. MapReduce分析明星微博数据

    互联网时代的到来,使得名人的形象变得更加鲜活,也拉近了明星和粉丝之间的距离.歌星.影星.体育明星.作家等名人通过互联网能够轻易实现和粉丝的互动,赚钱也变得前所未有的简单.同时,互联网的飞速发展本身也造 ...

  3. 利用 MapReduce分析明星微博数据实战

    互联网时代的到来,使得名人的形象变得更加鲜活,也拉近了明星和粉丝之间的距离.歌星.影星.体育明星.作家等名人通过互联网能够轻易实现和粉丝的互动,赚钱也变得前所未有的简单.同时,互联网的飞速发展本身也造 ...

  4. 对天气数据进行简单的数据分析

    用到的数据是在某地级市政府网站获取的公开数据,现以天气数据为例进行简单的数据分析 初始数据以xlsx格式储存: 初始的数据格式对于后续分析来说不太友好,我希望数据能够具有原子性,所以接下来利用exce ...

  5. Python爬取天气数据及可视化分析!

    来源丨Python之王 Python爬取天气数据及可视化分析 说在前面 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向.相对湿度.空气质量等成为关注的焦点.本 ...

  6. Python爬取天气数据及可视化分析(附源码)

    大家好,我是辰哥(文末送书) 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向.相对湿度.空气质量等成为关注的焦点.本次使用python中requests和Be ...

  7. Python爬取天气数据及可视化分析

    Python爬取天气数据及可视化分析 文章目录 Python爬取天气数据及可视化分析 说在前面 1.数据获取 请求网站链接 提取有用信息 保存csv文件 2.可视化分析 当天温度变化曲线图 当天相对湿 ...

  8. python天气数据可视化分析

    引言 网:tianqihoubao 对深圳近几月的天气进行分析可视化 需要用的库 pandas:用于数据挖掘,数据分析requests:用来get网页数据建立连接bs4:用来分析html数据进行格式化 ...

  9. MapReduce 分析 Youtube 数据

    MapReduce 分析 Youtube 数据 一.实验介绍 1.1 实验内容 MapReduce 是 Hadoop 的计算框架. 在运行一个 MR 程序时,任务过程被分为两个阶段:Map 阶段和 R ...

  10. 利用python简单分析抓包数据

    利用python简单分析抓包数据 wireshark的数据 先读一行看看长啥样 import json data_file = r'E:\download\data.json' with open(d ...

最新文章

  1. ThinkPHP快捷方法使用总结
  2. 统计5分钟内Nginx访问量及平均相应时间
  3. Leetcode 7. 整数反转
  4. a4988 脉宽要求_A4982/A4984/A4985和A4988设备主要针对办公室自动化市场
  5. 史上最简单的3D森林
  6. 例子---随机数/不重复的随机数
  7. 【转】CCScale9Sprite和CCControlButton
  8. Aspose-words结合Freemarker实现word邮件合并功能,批量处理word模板文件
  9. java jxl上传excel_JAVA实现上传,下载,jxl操作Excel和邮件发送
  10. 3dmax用vr渲染还是cr渲染器?
  11. Mac下Appium环境搭建
  12. 在计算机系统中 cpu指什么地方,在计算机中cpu指的是什么
  13. 【工具】D2RQ安装和配置
  14. 密码学七:MD5算法
  15. Qt应用程序图标设置任务栏图标设置
  16. 【读书笔记】【思考总结】《AKF15条架构原则》
  17. MongoDB4.0 配置文件
  18. Matlab中FFT运算加窗函数的验证
  19. Helm部署rancher 高可用集群
  20. 如何做高自由度的游戏

热门文章

  1. android 深色主题背景适配原理剖析
  2. java类加载器ClassLoader浅析
  3. 安卓直播详细教程(一)-----bilibili开源播放器
  4. 蚂蚁员工人均都能买1套杭州的房子了?!好后悔,当初错失了蚂蚁...
  5. 春运来了,你的火车票备好了么?
  6. 单机 搭建kafka集群 本地_单机简单搭建一个kafka集群(没有进行内核参数和JVM的调优)...
  7. 背景虚化_背景虚化的效果用手机怎么拍?原来这样简单
  8. python invalid character_python提示invalid character in identifier
  9. Linux 之CentOS7使用firewalld打开关闭防火墙与端口
  10. 帆软层次坐标常用公式整理