MapReduce实现排序功能

期间遇到了无法转value的值为int型,我采用try catch解决

str22
str11
str33
str14
str47
str25
str39

用的\t隔开,得到结果

str11,4

str2 2,5

str3 3,9

str4 7

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

我这里map,reduce都是单独出来的类,用了自定义的key

package com.kane.mr;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.WritableComparable;

import com.j_spaces.obf.fi;
//str2 2
//str1 1
//str3 3
//str1 4
//str4 7
//str2 5
//str3 9
public class IntPair implements WritableComparable<IntPair>{
public String getFirstKey() {
return firstKey;
}

public void setFirstKey(String firstKey) {
this.firstKey = firstKey;
}

public int getSecondKey() {
return secondKey;
}

public void setSecondKey(int secondKey) {
this.secondKey = secondKey;
}

private String firstKey;//str1
private int secondKey;//1
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(firstKey);
out.writeInt(secondKey);

}

@Override
public void readFields(DataInput in) throws IOException {
firstKey=in.readUTF();
secondKey=in.readInt();

}
//这里做比较,另一个是自身本类,对key进行排序
@Override
public int compareTo(IntPair o) {
// int first=o.getFirstKey().compareTo(this.firstKey);
// if (first!=0) {
// return first;
// }
// else {
// return o.getSecondKey()-this.secondKey;
// }
return o.getFirstKey().compareTo(this.getFirstKey());

}

}

package com.kane.mr;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class SortMapper extends Mapper<Object,Text,IntPair,IntWritable>{
public IntPair intPair=new IntPair();
public IntWritable intWritable=new IntWritable(0);
@Override
protected void map(Object key, Text value,//str1 1
Context context)
throws IOException, InterruptedException {
//String[] values=value.toString().split("/t");
System.out.println(value);
int intValue;
try {
intValue = Integer.parseInt(value.toString());
} catch (NumberFormatException e) {
intValue=6;
}//不加try catch总是读取value时,无法转成int型
intPair.setFirstKey(key.toString());
intPair.setSecondKey(intValue);
intWritable.set(intValue);
context.write(intPair, intWritable);// key(str2 2) 2
}

}

package com.kane.mr;

import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class SortReducer extends Reducer<IntPair, IntWritable, Text,Text>{

@Override
protected void reduce(IntPair key, Iterable<IntWritable> values,
Context context)
throws IOException, InterruptedException {
StringBuffer combineValue=new StringBuffer();
Iterator<IntWritable> itr=values.iterator();
while (itr.hasNext()) {
int value=itr.next().get();
combineValue.append(value+",");
}
context.write(new Text(key.getFirstKey()),new Text(combineValue.toString()));
}

}

package com.kane.mr;

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

public class PartionTest extends Partitioner<IntPair, IntWritable>{

@Override
public int getPartition(IntPair key, IntWritable value, int numPartitions) {//reduce个数

return (key.getFirstKey().hashCode()&Integer.MAX_VALUE%numPartitions);
}

}

package com.kane.mr;

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

public class TextComparator extends WritableComparator{
public TextComparator(){
super(IntPair.class,true);
}

@Override
public int compare(WritableComparable a, WritableComparable b) {
IntPair o1=(IntPair)a;
IntPair o2=(IntPair)b;
return o1.getFirstKey().compareTo(o2.getFirstKey());
}

}

package com.kane.mr;

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
@SuppressWarnings("rawtypes")
public class TextIntCompartor extends WritableComparator{

protected TextIntCompartor() {
super(IntPair.class,true);
}

@Override
public int compare(WritableComparable a,  WritableComparable b) {
IntPair o1=(IntPair)a;
IntPair o2=(IntPair)b;
int first=o1.getFirstKey().compareTo(o2.getFirstKey());
if (first!=0) {
return first;
}
else {
return o1.getSecondKey()-o2.getSecondKey();
}
}

}

package com.kane.mr;

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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class SortMain {
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
   String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
   if (otherArgs.length != 2) {
     System.err.println("Usage: wordcount <in> <out>");
     System.exit(2);
   }
   Job job = new Job(conf, "Sort");
   job.setJarByClass(SortMain.class);
   job.setInputFormatClass(KeyValueTextInputFormat.class);//设定输入的格式是key(中间\t隔开)value
   job.setMapperClass(SortMapper.class);
   //job.setCombinerClass(IntSumReducer.class);
   job.setReducerClass(SortReducer.class);

   job.setMapOutputKeyClass(IntPair.class);
   job.setMapOutputValueClass(IntWritable.class);

   job.setSortComparatorClass(TextIntCompartor.class);
   job.setGroupingComparatorClass(TextComparator.class);//以key 进行group by
   job.setPartitionerClass(PartionTest.class);

   job.setOutputKeyClass(Text.class);
   job.setOutputValueClass(Text.class);

   FileInputFormat.addInputPath(job, new Path(otherArgs[0]));//输入参数,对应hadoop jar 对应类运行时在后面加的第一个参数
   FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));//输出参数
   System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

导出jar包放到hadoop下,然后讲sort.txt放入到hdfs中,然后用hadoop jar KaneTest/sort.jar com.kane.mr.SoetMain /kane/sort.txt /kane/output命令执行

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索hadoop
, class
, mapreduce
, apache
, import
, public
hadoop job
mapreduce 排序、mapreduce 二次排序、mapreduce value排序、mapreduce排序算法、mapreduce排序原理,以便于您获取更多的相关知识。

时间: 2024-10-30 03:32:07

MapReduce实现排序功能的相关文章

DataGrid同时具有分页和排序功能及注意点

datagrid|分页|排序 当DataGrid同时具有分页和排序功能时应注意在重新绑定数据源时,MyDataGrid.CurrentPageIndex=0;下面给实现以上功能的原码,也就不多缀了aspx中包含有DataGrid和控制其数据源变化的dropdownlistDataGrid代码 <asp:datagrid id="MyDataGrid" runat="server" BorderColor="#CCCCCC" Font-Siz

用好Excel 2007的筛选和排序功能

很多人在用上Excel 2007之后可能都会惊叹于Excel 2007功能的强大,对于普通用户来说,Excel 2007最为强大的便是其数据分析能力.如果只是使用表格来记录一些简单的数据,那么使用Word 2007的表格功能就可以完成,完全没有必要请Excel 2007这位数据分析大师出马.不过数据分析也是一件说着容易做起来难的事情,这里就学习一下,如何利用筛选和排序功能,从最基本的数据分析工作做起. 筛选! 给数据"过筛子" 股市终于大涨啦,郁闷已久的股民终于看到曙光了!在众多被&q

ASP.NET:DataGrid控件的排序功能

asp.net|datagrid|datagrid控件|排序 上一节我们已经知道DataGrid排序功能是由AllowSorting属性控制的,这一小节里,我们将通过实例来验证这个功能.     在DataCon Web项目里,添加一个窗体,命名为DataGrid_Sample4.aspx,添加一个DataGrid控件,DataGrid_Sample4.aspx的主要HTML代码如下:<body MS_POSITIONING="GridLayout"><form id

使用Dreamweaver MX表格排序功能

dreamweaver|排序 教育信息化时代,考试成绩也要求上网公布.一次我将考试成绩制作成一个HTML文件,如图1所示,领导审查的意见是"将成绩按名次排列",可是所有的成绩已经用Dreamweaver MX制作好了,若先用Execl按要求排序,再导入到Dreamweaver MX制作,呵呵!太麻烦了,早就知道Dreamweaver具有排序功能,一直没有实战,何不利用Dreamweaver MX演练一番? 在Dreamweaver MX中,您可以对一列的内容进行简单排序,也可以对两列的

Symbian OS中的RArray类的排序功能

RArray类,属于symbian OS提供的基础容器类,并且是比较重要和常用的一个. 如果从名字来看这是一个数据类,功能貌似和 MFC的CArray,stl的vector差不多吧?如果这么想就错了,RArray是个泛型数组容器类,但是功能比CArray vector 提供的要多. 尤其是他提供的排序和查找功能,其实现方法比较诡异,对初学者来说容易造成迷惑.个人认为这个设计比较蹩脚,至于为什么会这样,我想不出,已经写信给作者咨询了,不过还没得到答复. RArray的排序是这样的,它规定数组中每个

在C#中实现对ListView点击列标题自动排序功能

先定义一个ListViewHelper类,代码如下: using System; using System.Collections; using System.Windows.Forms; namespace Common { /// <summary> /// 对ListView点击列标题自动排序功能 /// </summary> public class ListViewHelper { /// <summary> /// 构造函数 /// </summary

WINFORM中绑定对象支持排序功能

在很久很久以前,DataSet操作是.Net中的一个重要使用手段,其实现在也是 . 在很久很久以前,我的项目操作方式是通过数据Fill一个DataSet,之后返回 给业务层做处理,之后给页面去显示. 随着时间积累,越来越不喜欢DataSet,我记得有人跟我说DataTable比 DataSet效率高,我不反驳也不认同,不知道. 我只知道DataSet如果不做任何处理在WebService上传输效率极其低下. 之后的编程模式中引入了对象的概念.至于对象的好处,在此不做论述. 这篇文章主要表述不是对

JQuery实现带排序功能的权限选择实例

  本文实例讲述了JQuery实现带排序功能的权限选择.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 7

excel排序功能设置

当我们用Excel2003编辑统计数据表时,大量的数据整理起立比较麻烦,然而在这种情况下我们可以利用Excel排序功能来游览.查询相关的数据.下面来体验一下Excel的排序功能. 操作步骤 1.打开"统计表"选择任意一个单元格,点击"降序排序". 2.接下来单击"数据"→"排序"来设置"排序方式". 3.此时弹出"排序"设置栏,将"主要关键字"."次要关键字