学习笔记,如有错误,望大佬指点!多谢!
何为二次排序?本人理解,两个数字,同时排序,当第一列数字相等时,按照第二列数字排序!!!
原数据 代码如下: package TowPaixu; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.WritableComparable; 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.DataInput; import java.io.DataOutput; import java.io.IOException; class Towpxmap extends Mapper<LongWritable, Text, Px, NullWritable> { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line=value.toString(); String[] word=line.split("\t"); String name=word[0]; int yi=Integer.parseInt(word[1]); int er=Integer.parseInt(word[2]); context.write(new Px(name,yi,er),NullWritable.get()); } } class Toupxreducer extends Reducer<Px, NullWritable,Text,NullWritable>{ @Override protected void reduce(Px key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException { context.write(new Text(key.toString()),NullWritable.get()); } } class Driver{ public static void main(String[] args) throws Exception { Configuration conf=new Configuration(); Job job=Job.getInstance(conf); job.setMapperClass(Towpxmap.class); job.setReducerClass(Toupxreducer.class); job.setJarByClass(Driver.class); job.setMapOutputKeyClass(Px.class); job.setMapOutputValueClass(NullWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(NullWritable.class); FileInputFormat.setInputPaths(job,new Path("E:\\0102.txt")); FileOutputFormat.setOutputPath(job,new Path("E:\\tmp")); System.exit(job.waitForCompletion(true)?0:1); } } class Px implements WritableComparable<Px> { //数据类型以实际情况而定 private String name; private int yi; private int er; public Px(){} public Px(String a,int b,int c){ this.name=a; this.yi=b; this.er=c; } @Override public int compareTo(Px o) { if(this.yi==o.getYi()){ return this.er>o.getEr()?-1:1;//-1为小于,0为等于,1为大于 } else { return this.yi>o.getYi()?-1:1; } } @Override public void write(DataOutput dataOutput) throws IOException { dataOutput.writeUTF(name); dataOutput.writeInt(yi); dataOutput.writeInt(er); } @Override public void readFields(DataInput dataInput) throws IOException { this.name=dataInput.readUTF(); this.yi=dataInput.readInt(); this.er=dataInput.readInt(); } //右键生成getset public String getName() { return name; } public void setName(String name) { this.name = name; } public int getYi() { return yi; } public void setYi(int yi) { this.yi = yi; } public int getEr() { return er; } public void setEr(int er) { this.er = er; } //右键生成tostring @Override public String toString() { return "名字:"+name+"\t"+"价格:"+yi+"\t"+"数量:"+er; } }
分析效果图: