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

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. DOM方法index()相关问题(为何$(this).index(this)是错误的 )

    写jQuery的时候遇到一个关于index()的问题,查找相关资料后,解决了,把自己的想法写在下面. index() 方法返回指定元素相对于其他指定元素的 index 位置. 完全语法为:$(sele ...

  2. tortoisegit安装、clon、推送

    下载/tortoisegit软件,根据对应系统下载相对应的软件及其汉化包   下载地址:https://tortoisegit.org/download/ 先安装软件包,再安装语言包,可以自己设置路径 ...

  3. Ubuntu 17.04 搭建LAMP服务器环境流程

    安装Apache2 安装代码 sudo apt-get install apache2 更改默认目录 sudo vim /etc/apache2/apache2.conf // 将 <Direc ...

  4. Python函数式编程——map()、reduce()

    文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理 ...

  5. SpringBoot整合SpringBatch实用简例

    SpringBatch主要是一个轻量级的大数据量的并行处理(批处理)的框架. 作用和Hadoop很相似,不过Hadoop是基于重量级的分布式环境(处理巨量数据),而SpringBatch是基于轻量的应 ...

  6. python之IO model

    一.事件驱动模型 在介绍协程时,遇到IO操作就切换,但什么时候切换回来,怎么确定IO操作结束? 很多人可能会考虑使用“线程池”或“连接池”.“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的 ...

  7. 线性基【CF845G】Shortest Path Problem?

    Description 给定一张 \(n\) 个点 \(m\) 条边的无向图,一开始你在点 \(1\),且价值为 \(0\) 每次你可以选择一个相邻的点,然后走过去,并将价值异或上该边权 如果在点 \ ...

  8. Luogu P2486 染色(树链剖分+线段树)

    题解 不妨采取重链剖分的方式把路径剖成区间,然后用线段树维护,考虑如何合并一个区间 struct Node { int lf, rg, tot; }seg[N << 2]; int col ...

  9. Visual Studio Xamarin中找不到iOS模拟器

    Visual Studio Xamarin中找不到iOS模拟器 Visual Studio可以正常连接Mac系统,但是在测试时候,提示以下错误信息:Failed to start iOS Simula ...

  10. 【二分图】【并查集】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem L. Canonical duel

    给你一个网格(n<=2000,m<=2000),有一些炸弹,你可以选择一个空的位置,再放一个炸弹并将其引爆,一个炸弹爆炸后,其所在行和列的所有炸弹都会爆炸,连锁反应. 问你所能引爆的最多炸 ...