温度排序代码,具体说明可以搜索其他博客

KeyPair.java

package temperaturesort;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.WritableComparable; import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; public class KeyPair implements WritableComparable<KeyPair> {
private int hot;
private int year; public int getYear() {
return year;
} public void setYear(int year) {
this.year = year;
} public int getHot() {
return hot;
} public void setHot(int hot) {
this.hot = hot;
} public int compareTo(KeyPair o) {
int result = this.year-o.getYear();
if(result!=0){
return result<0?-1:1;
}
return -( this.hot < o.getHot() ? -1 :(this.hot == o.getHot()?0:1));
} public void write(DataOutput dataOutput) throws IOException {
dataOutput.writeInt(year);
dataOutput.writeInt(hot);
} public void readFields(DataInput dataInput) throws IOException {
this.year=dataInput.readInt();
this.hot=dataInput.readInt();
} @Override
public String toString() {
return year+"\t"+hot;
} @Override
public int hashCode() {
return new Integer(year+hot).hashCode();
}
}

Sort.java:

package temperaturesort;

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator; public class Sort extends WritableComparator {
public Sort(){
super(KeyPair.class,true);
} @Override
public int compare(WritableComparable a, WritableComparable b) {
KeyPair key1 = (KeyPair)a;
KeyPair key2 = (KeyPair)b;
int result = key1.getYear()-key2.getYear();
if(result!=0){
return result<0?-1:1;
}
return key1.getHot()< key2.getHot() ? 1 :(key1.getHot() == key2.getHot()?0:-1);
}
}

Partition.java:

package temperaturesort;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner; public class Partition extends Partitioner<KeyPair,Text>{
@Override
public int getPartition(KeyPair keyPair, Text text, int num) {
return keyPair.getYear()*127 % num;
}
}

Group.java:

package temperaturesort;

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator; public class Group extends WritableComparator {
public Group(){
super(KeyPair.class,true);
} @Override
public int compare(WritableComparable a, WritableComparable b) {
KeyPair key1 = (KeyPair)a;
KeyPair key2 = (KeyPair)b;
return key1.getYear() < key2.getYear() ? -1 : (key1.getYear()==key2.getYear()?0:1);
}
}

RunJob.java:

package temperaturesort;

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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; public class RunJob {
public static class TempSortMapper extends Mapper<Object,Text,KeyPair,Text>{
static SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
protected void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
String[] strArr=line.split("\t");
if(strArr.length==2){
try {
Date date = simpleDateFormat.parse(strArr[0]);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int year = calendar.get(1);
int hot = Integer.parseInt(strArr[1].substring(0,strArr[1].indexOf("C")));
KeyPair keyPair =new KeyPair();
keyPair.setHot(hot);
keyPair.setYear(year);
/*System.out.println("-------------------------------------------------------------------");
System.out.println(keyPair);*/
context.write(keyPair,value);
} catch (ParseException e) {
e.printStackTrace();
}
} }
} public static class TempSortReducer extends Reducer<KeyPair,Text,KeyPair,Text>{
@Override
protected void reduce(KeyPair key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
for(Text text:values)
context.write(key,text);
}
} public static void main(String[] args) throws Exception {
//System.setProperty("hadoop.home.dir","E:\\softs\\majorSoft\\hadoop-2.7.5");
Configuration conf = new Configuration();
conf.set("mapreduce.app-submission.cross-platform", "true");
Path fileInput = new Path("hdfs://mycluster/testFile/hot.txt");
Path fileOutput = new Path("hdfs://mycluster/output/hot"); Job job =Job.getInstance(conf ,"temperatureSort");
job.setJar("E:\\bigData\\hadoopDemo\\out\\artifacts\\wordCount_jar\\hadoopDemo.jar");
job.setJarByClass(RunJob.class);
job.setMapperClass(TempSortMapper.class);
job.setReducerClass(TempSortReducer.class);
job.setMapOutputKeyClass(KeyPair.class);
job.setMapOutputValueClass(Text.class); job.setNumReduceTasks(3);
job.setSortComparatorClass(Sort.class);
job.setPartitionerClass(Partition.class);
job.setGroupingComparatorClass(Group.class); FileInputFormat.addInputPath(job,fileInput);
FileOutputFormat.setOutputPath(job,fileOutput);
System.exit(job.waitForCompletion(true)?0:1);
}
}

其中自定义的sort和parititon是在mapTask任务之后使用的,而Group是在reduce任务使用的。

使用MapReduce实现温度排序的更多相关文章

  1. 详细讲解MapReduce二次排序过程

    我在15年处理大数据的时候还都是使用MapReduce, 随着时间的推移, 计算工具的发展, 内存越来越便宜, 计算方式也有了极大的改变. 到现在再做大数据开发的好多同学都是直接使用spark, hi ...

  2. Hadoop学习笔记—11.MapReduce中的排序和分组

    一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出,在Step1.4也就是第四步中,需要对不同分区中的数据进行排 ...

  3. Hadoop学习笔记: MapReduce二次排序

    本文给出一个实现MapReduce二次排序的例子 package SortTest; import java.io.DataInput; import java.io.DataOutput; impo ...

  4. (转)MapReduce二次排序

    一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求 ...

  5. MapReduce——计算温度最大值 (基于全新2.2.0API)

    MapReduce——计算温度最大值 (基于全新2.2.0API) deprecated: Job类的所有Constructors, 新的API用静态方法getInstance(conf)来去的Job ...

  6. mapreduce 实现数子排序

    设计思路: 使用mapreduce的默认排序,按照key值进行排序的,如果key为封装int的IntWritable类型,那么MapReduce按照数字大小对key排序,如果key为封装为String ...

  7. mapreduce数据处理——统计排序

    接上篇https://www.cnblogs.com/sengzhao666/p/11850849.html 2.数据处理: ·统计最受欢迎的视频/文章的Top10访问次数 (id) ·按照地市统计最 ...

  8. [MapReduce_7] MapReduce 中的排序

    0. 说明 部分排序 && 全排序 && 采样 && 二次排序 1. 介绍 sort 是根据 Key 进行排序 [部分排序] 在每个分区中,分别进行排序 ...

  9. MapReduce二次排序

    默认情况下,Map 输出的结果会对 Key 进行默认的排序,但是有时候需要对 Key 排序的同时再对 Value 进行排序,这时候就要用到二次排序了.下面让我们来介绍一下什么是二次排序. 二次排序原理 ...

随机推荐

  1. Python中的PIL

    转自:http://blog.csdn.net/yockie/article/details/8498301 介绍 把Python的基础知识学习后,尝试一下如何安装.加载.使用非标准库,选择了图像处理 ...

  2. LoadRunner Agent Runtime Settings Configuration启动报错

    解决方法: 关闭负载机器上的防火墙功能即可解决

  3. LoadRunner 执行单句SQL语句

    LoadRunner 执行单句SQL语句 Action() { int NumRows=0; int i=1; //建立数据库连接 lr_db_connect("StepName=Datab ...

  4. catalina.out日志切割

    安装cronlog rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum ins ...

  5. SpringMVC一些功能

    1.日期格式转换 当页面提交日期格式时 默认的格式为2017/10/1 如果指定日期格式为2017-10-1 //初始化绑定日期格式--不定义初始化格式时只能默认用yyyy/MM/dd格式 @Init ...

  6. Codeforces 1082 D. Maximum Diameter Graph-树的直径-最长链-构造题 (Educational Codeforces Round 55 (Rated for Div. 2))

    D. Maximum Diameter Graph time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  7. Linux操作命令(五)

    find . -name ”*.c" -exec ./command.sh {} \; 本次实验将介绍 Linux 命令中 find 和 xargs 命令的用法. find xargs 1. ...

  8. 【Nginx】初试反向代理:反向代理的原理和用途

    Nginx是一个轻量级的服务器,是一个俄罗斯的开发者开发的开源软件.Nginx具有占内存小.并发能力高的特点,底层采用epoll(Linux2.6+)和kqueue(FREEBSD)网络I/O模型,相 ...

  9. 高效的 itertools 模块(转)

    原文地址:http://python.jobbole.com/87380/ 我们知道,迭代器的特点是:惰性求值(Lazy evaluation),即只有当迭代至某个值时,它才会被计算,这个特点使得迭代 ...

  10. 【树形dp】Codeforces Round #405 (rated, Div. 1, based on VK Cup 2017 Round 1) B. Bear and Tree Jumps

    我们要统计的答案是sigma([L/K]),L为路径的长度,中括号表示上取整. [L/K]化简一下就是(L+f(L,K))/K,f(L,K)表示长度为L的路径要想达到K的整数倍,还要加上多少. 于是, ...