使用MapReduce实现温度排序
温度排序代码,具体说明可以搜索其他博客
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实现温度排序的更多相关文章
- 详细讲解MapReduce二次排序过程
我在15年处理大数据的时候还都是使用MapReduce, 随着时间的推移, 计算工具的发展, 内存越来越便宜, 计算方式也有了极大的改变. 到现在再做大数据开发的好多同学都是直接使用spark, hi ...
- Hadoop学习笔记—11.MapReduce中的排序和分组
一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出,在Step1.4也就是第四步中,需要对不同分区中的数据进行排 ...
- Hadoop学习笔记: MapReduce二次排序
本文给出一个实现MapReduce二次排序的例子 package SortTest; import java.io.DataInput; import java.io.DataOutput; impo ...
- (转)MapReduce二次排序
一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求 ...
- MapReduce——计算温度最大值 (基于全新2.2.0API)
MapReduce——计算温度最大值 (基于全新2.2.0API) deprecated: Job类的所有Constructors, 新的API用静态方法getInstance(conf)来去的Job ...
- mapreduce 实现数子排序
设计思路: 使用mapreduce的默认排序,按照key值进行排序的,如果key为封装int的IntWritable类型,那么MapReduce按照数字大小对key排序,如果key为封装为String ...
- mapreduce数据处理——统计排序
接上篇https://www.cnblogs.com/sengzhao666/p/11850849.html 2.数据处理: ·统计最受欢迎的视频/文章的Top10访问次数 (id) ·按照地市统计最 ...
- [MapReduce_7] MapReduce 中的排序
0. 说明 部分排序 && 全排序 && 采样 && 二次排序 1. 介绍 sort 是根据 Key 进行排序 [部分排序] 在每个分区中,分别进行排序 ...
- MapReduce二次排序
默认情况下,Map 输出的结果会对 Key 进行默认的排序,但是有时候需要对 Key 排序的同时再对 Value 进行排序,这时候就要用到二次排序了.下面让我们来介绍一下什么是二次排序. 二次排序原理 ...
随机推荐
- WordPress固定链接设置的几种方法(推荐/%post_id%.html)
传说中,固定链接有SEO功能,今天试了试,现在给大家分享一下: wordpress固定链接设置技巧: 1.不要让日期出现在固定链接里面 这基于两个方面的考虑.一是如果数字出现在固定链接里面,等于提醒搜 ...
- T-SQL备忘(6):常用内置函数
日期和时间函数: 1.获取当前时间:GETDATE() select GETDATE() 返回: 2015-04-27 20:52:06.700 2.返回时间的部分(日.月.年) a.获取日: sel ...
- Java学习之路(转)
Java学习之路(书籍推荐) 一.基础类 1.<Thinking in java>(阅读2遍),入门第一位是建立正确的概念 2.<Core Java>这本书更贴近实践,更多 ...
- POJ 1089 Intervals【合并n个区间/贪心】
There is given the series of n closed intervals [ai; bi], where i=1,2,...,n. The sum of those interv ...
- 洛谷P3620 [APIO/CTSC 2007] 数据备份 [堆,贪心,差分]
题目传送门 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽 ...
- vue中回到顶部
1. 回到顶部,使用 scrollIntoView 方法: Element.scrollIntoView方法滚动当前元素,进入浏览器的可见区域 该方法可以接受一个布尔值作为参数.如果为true,表示元 ...
- Android Theme.AppCompat.Light的解决方法
styles.xml中<style name="AppBaseTheme" parent="Theme.AppCompat.Light">提示如下错 ...
- Linux基础系列-Day6
Samba服务(基于CentOS 7.0) Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成,Samba主要用于Linux或UNIX和Windows系统之 ...
- 通过myEclipse创建hibernate的实体类
今天有个新项目中需要使用到hibernate,刚好数据库表已经创建完毕,就顺便来总结一下通过myEclipse创建hibernate的实体类. 1..在myEclipse中选择MyEclipse Da ...
- 【CodeVS 2845】排序的代价
http://codevs.cn/problem/2845/ 好难的题啊qwq 没想到把排好序的数组的第i位和原数组的第i位的值看成一个单射函数,这样这是一个长度为n的置换. 对于置换的其中一个循环, ...