案例描述
  找出每个月气温最高的2天

数据集

-- ::    34c
-- ::    38c
-- ::    36c
-- ::    32c
-- ::    37c
-- ::    23c
-- ::    41c
-- ::    27c
-- ::    45c
-- ::    46c
-- ::    47c

代码

  MyTQ.class

package com.hadoop.mr.tq;

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
 * 客户端
 * @author Lindsey
 *
 */
public class MyTQ {

    public static void main(String args []) throws Exception{
        //加载配置文件
        Configuration conf = new Configuration(true);

        //创建客户端
        Job job = Job.getInstance(conf);
        job.setJarByClass(MyTQ.class);

        //Map配置
        job.setMapperClass(TMapper.class);
        job.setMapOutputKeyClass(Tq.class);
        job.setMapOutputValueClass(IntWritable.class);

        //分区类:处理大数据量均衡并发处理
        job.setPartitionerClass(TPartitioner.class);

        //比较类:用buffer字节数组内的key排序
        job.setSortComparatorClass(TSortComparator.class);

        //Reduce配置
        job.setNumReduceTasks(2);
        job.setReducerClass(TReducer.class);

        //分组比较类:年月相同为一组
        job.setGroupingComparatorClass(TGroupingComparator.class);

        //输入输出源
        Path input = new Path("/user/hadoop/input/weather.txt");
        FileInputFormat.addInputPath(job, input);
        Path output = new Path("/user/hadoop/output/weather");
        if(output.getFileSystem(conf).exists(output)){
            output.getFileSystem(conf).delete(output,true);
        }
        FileOutputFormat.setOutputPath(job, output);

        //提交
        job.waitForCompletion(true);
    }
}

  TMapper.class

package com.hadoop.mr.tq;

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.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.util.StringUtils;

public class TMapper extends Mapper<LongWritable, Text, Tq,IntWritable>{

    /*
     *     k-v 映射
     *          K(Tq)        V(IntWritable)
     *  1949-10-01 14:21:02    34c
     *
     */

    Tq mkey = new Tq();
    IntWritable mval =new IntWritable();

    @Override
    protected void map(LongWritable key, Text value,Context context)
            throws IOException, InterruptedException {

        try {
            //字符串分割
            String [] strs = StringUtils.split(value.toString(),'\t');
            //设置时间格式  注意月份是大写!
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            //解析为Date格式
            Date date =  sdf.parse(strs[0]);
            //日历上设置时间
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);

            //Key
            mkey.setYear(cal.get(Calendar.YEAR));
            mkey.setMonth(cal.get(Calendar.MONTH)+1);
            mkey.setDay(cal.get(Calendar.DAY_OF_MONTH));
            int temperture = Integer.parseInt(strs[1].substring(0,strs[1].length()-1));
            mkey.setTemperature(temperture);

            //value
            mval.set(temperture);

            //输出
            context.write(mkey, mval);

        } catch (ParseException e) {
            e.printStackTrace();
        }

    }

}

  Tq.class

package com.hadoop.mr.tq;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;

public class Tq implements WritableComparable<Tq>{

    private int year;
    private int month;
    private int day;
    private int temperature;

    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 getTemperature() {
        return temperature;
    }

    public void setTemperature(int temperature) {
        this.temperature = temperature;
    }

    @Override
    public void readFields(DataInput in) throws IOException {
        this.year=in.readInt();
        this.month=in.readInt();
        this.day=in.readInt();
        this.temperature=in.readInt();
    }

    @Override
    public void write(DataOutput out) throws IOException {
        out.writeInt(year);
        out.writeInt(month);
        out.writeInt(day);
        out.writeInt(temperature);
    }

    @Override
    public int compareTo(Tq that) {
        //约定:日期正序
        int y = Integer.compare(this.year,that.getYear());
        if(y == 0){    //年份相同
            int m = Integer.compare(this.month,that.getMonth());
            if(m == 0){    //月份相同
                return Integer.compare(this.day,that.getDay());
            }
            return m;
        }
        return y;
    }
}

  TPartitioner.class

package com.hadoop.mr.tq;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Partitioner;

/**
 * 分区规则设计 使数据分区均衡避免倾斜
 * @author Lindsey
 *
 */
public class TPartitioner extends Partitioner<Tq,IntWritable>{

    @Override
    public int getPartition(Tq key, IntWritable value, int numPartitions) {

        return key.getYear() % numPartitions;
    }

}

  TSortComparator.class

package com.hadoop.mr.tq;

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;

public class TSortComparator extends WritableComparator{

    //对字节数据中map排序        需要先将Key反序列化为对象再比较
    public TSortComparator(){
        super(Tq.class,true);    //true是将Tq实例化
    }

    /* 时间正序 、温度倒序 */
    @Override
    public int compare(WritableComparable a, WritableComparable b) {

        Tq t1 = (Tq) a;
        Tq t2 = (Tq) b;

        int y = Integer.compare(t1.getYear(),t2.getYear());
        if(y == 0){
            int m = Integer.compare(t1.getMonth(),t2.getMonth());
            if(m == 0){
                //加上负号实现倒序
                return -Integer.compare(t1.getTemperature(),t2.getTemperature());
            }
            return m;
        }
        return y;
    }
}

  TReducer.class

package com.hadoop.mr.tq;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.shaded.org.glassfish.grizzly.compression.lzma.impl.lz.InWindow;

public class TReducer extends Reducer<Tq, IntWritable, Text,IntWritable>{

    Text rkey = new Text();
    IntWritable rval = new IntWritable();
    /*
     * 相同的Key为一组:Tq
     */
    @Override
    protected void reduce(Tq key, Iterable<IntWritable> values, Context context)
            throws IOException, InterruptedException {
        int flg = 0;    //标志,表示是否已经取了当天的天气
        int day = 0;
        for(IntWritable v:values){
            if(flg == 0){
                day = key.getDay();
                //设置文本内容 yyyy-mm-dd:temperture
                rkey.set(key.getYear()+"-"+key.getMonth()+"-"+key.getDay());
                rval.set(key.getTemperature());
                flg++;
                context.write(rkey, rval);
            }

            if(flg!=0 && day!=key.getDay()){
                rkey.set(key.getYear()+"-"+key.getMonth()+"-"+key.getDay());
                rval.set(key.getTemperature());
                context.write(rkey, rval);
                break;
            }
        }
    }
}

  TGroupingComparator.class

package com.hadoop.mr.tq;

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;

public class TGroupingComparator extends WritableComparator{

    public TGroupingComparator() {
        super(Tq.class,true);
    }
    /*
     * 面向Reduce
     * 年月相同为一组  返回0表示为同一组
     */
    @Override
    public int compare(WritableComparable a, WritableComparable b) {

        Tq t1 = (Tq) a;
        Tq t2 = (Tq) b;

        int y = Integer.compare(t1.getYear(),t2.getYear());
        if(y == 0){
            return Integer.compare(t1.getMonth(),t2.getMonth());
        }
        return y;
    }
}

运行结果

  part-r-00000

  

  part-r-00001

  

【尚学堂·Hadoop学习】MapReduce案例1--天气的更多相关文章

  1. 【尚学堂·Hadoop学习】MapReduce案例2--好友推荐

    案例描述 根据好友列表,推荐好友的好友 数据集 tom hello hadoop cat world hadoop hello hive cat tom hive mr hive hello hive ...

  2. 尚学堂xml学习笔记

    1.打开eclipse,文件-新建java project,输入文件的名字,比如输入20181112. 2.对着src右键,选择new-file,输入文件名字,比如:book.xml. 3.开始写.x ...

  3. 大数据学习——mapreduce案例join算法

    需求: 用mapreduce实现select order.orderid,order.pdtid,pdts.pdt_name,oder.amount from orderjoin pdtson ord ...

  4. 尚学堂 hadoop

    mr spark storm 都是分布式计算框架,他们之间不是谁替换谁的问题,是谁适合做什么的问题. mr特点,移动计算,而不移动数据. 把我们的计算程序下发到不同的机器上面运行,但是不移动数据. 每 ...

  5. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  6. Hadoop学习之第一个MapReduce程序

    期望 通过这个mapreduce程序了解mapreduce程序执行的流程,着重从程序解执行的打印信息中提炼出有用信息. 执行前 程序代码 程序代码基本上是<hadoop权威指南>上原封不动 ...

  7. Hadoop学习之旅三:MapReduce

    MapReduce编程模型 在Google的一篇重要的论文MapReduce: Simplified Data Processing on Large Clusters中提到,Google公司有大量的 ...

  8. hadoop 学习笔记:mapreduce框架详解

    开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能 ...

  9. Hadoop学习笔记:MapReduce框架详解

    开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能 ...

随机推荐

  1. Pyinstaller 打包exe

    安装 ​ pip insatll Pyinstaller 参数 pyinstaller -Fw main.py 参数 概述 -F,-onefile 打包一个单个文件,如果你的代码都写在一个.py文件的 ...

  2. 有关CSS的overflow和border-radius的那些事,你的圆角被覆盖了吗?

    事件起因 最初是网友的一个提问,来自于我的知识星球社区: 说实话,不得不佩服这个网友的眼力,这么小的细节都能发现.不过这也正是 FineUI 一直前进的动力,来自社区的监督和促进. 从截图上看,貌似圆 ...

  3. 周末学习笔记——day02(带参装饰器,wraps修改文档注释,三元表达式,列表字典推导式,迭代器,生成器,枚举对象,递归)

    一,复习 ''' 1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改 ...

  4. Nginx配置http跳转https访问

    Nginx强制http跳转https访问有以下几个方法 nginx的rewrite方法 可以把所有的HTTP请求通过rewrite重写到HTTPS上 配置 方法一 server{ listen ; s ...

  5. django 之MTV模型

    一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负 ...

  6. 实验一 windows基本网络命令

    一. 实验目的 1. 了解windows系统中网络命令的基本功能. 2. 掌握基本网络命令的使用方法. 3. 掌握使用网络命令观察网络状态的方法. 二.实验环境 1. 软件环境:Microsoft W ...

  7. LODOP打印当前日期时间的方法

    JS方法直接获取.之前有个详细介绍的博文:LODOP打印用JS获取的当前日期本文也再演示一下,详细介绍见上面链接的博文,该方法此文不做详细介绍. 本文有三段:1.JS获取日期,2,.LODOP的FOR ...

  8. Python实现FTP文件的上传和下载

    # coding: utf-8 import os from ftplib import FTP def ftp_connect(host, username, password): ftp = FT ...

  9. 特殊计数序列——第一类斯特林(stirling)数

    第一类斯特林数 在这里我因为懒所以还是用\(S(n,m)\)表示第一类斯特林数,但一定要和第二类斯特林数区分开来 递推式 \(S(n,m)=S(n-1.m-1)+S(n-1,m)*(n-1)\) 其中 ...

  10. JSON序列化不想新建很多对象实体怎么办

    不用新建对象,而是用JSONObject 相当于Map类型,重复的key 会覆盖 //序列化JSONObject jsonObject = new JSONObject();jsonObject.pu ...