MapReduce排序输出

hadoop的map是具有输出自动排序功能的~继续学习~

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import java.io.IOException;

public class Sort extends Configured implements Tool {
  //这里map将输入的value转化成IntWritable类型,作为输出的key
    public static class Map extends Mapper<Object,Text,IntWritable,IntWritable> {
        private static IntWritable data = new IntWritable();

        public void map(Object key,Text value,Context context) throws IOException,InterruptedException {
            String line = value.toString();
            System.out.println("line" + line);
            data.set(Integer.parseInt(line));
            context.write(data, new IntWritable(1));
        }
    }
  //reduce将输入的key复制到输出的value上,然后根据输入的value-list中的元素的个数决定key的输出次数
    public static class Reduce extends Reducer<IntWritable,IntWritable,IntWritable,IntWritable> {    //全局linenum来代表key的位次
        private static IntWritable linenum = new IntWritable(1);

        public void reduce(IntWritable key,Iterable<IntWritable> values,Context context) throws
                IOException,InterruptedException{
            for(IntWritable val : values){
                context.write(linenum,key);
                System.out.println(linenum+"    "+key);
                linenum = new IntWritable(linenum.get()+1);
            }
        }
    }

    public  int run(String[] args) throws Exception{
        Configuration aaa = new Configuration();
        Job job = Job.getInstance(aaa);
        String InputPaths = "/usr/local/idea-IC-139.1117.1/Hadoop/out/datainput/sort.txt";
        String OutputPath = "/usr/local/idea-IC-139.1117.1/Hadoop/out/dataout/";

        job.setJarByClass(Sort.class);
        job.setJobName("Sort");

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

        job.setMapperClass(Map.class);
        job.setReducerClass(Reduce.class);
        FileInputFormat.setInputPaths(job, new Path(InputPaths));
        FileOutputFormat.setOutputPath(job, new Path(OutputPath));
        job.setOutputKeyClass(IntWritable.class);
        job.setOutputValueClass(IntWritable.class);

        boolean success = job.waitForCompletion(true);
        return success ? 0 : 1;

    }

    public static void main(String[] args) throws Exception{
        int ret = ToolRunner.run(new Sort(),args);
        System.exit(ret);
    }
}

时间: 2024-10-14 18:39:06

MapReduce排序输出的相关文章

Hadoop阅读笔记(三)——深入MapReduce排序和单表连接

继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算方法,更是一种解决问题的新思维.新思路.将原先看似可以一条龙似的处理一刀切成两端,一端是Map.一端是Reduce,Map负责分,Reduce负责合. 1.MapReduce排序 问题模型: 给出多个数据文件输入如: sortfile1.txt 11 13 15 17 19 21 23 25 27

hadoop mapreduce排序原理

 hadoop  mapreduce排序原理 Hadoop 案例3----数据排序  简单问题  (入门级别) "数据排序"是许多实际任务执行时要完成的第一项工作, 比如学生成绩评比.数据建立索引等.这个实例和数据去重类似,都是先对原始数据进行初步处理,为进一步的数据操作打好基础.下面进入这个示例. 1.需求描述 对输入文件中数据进行排序.输入文件中的每行内容均为一个数字,即一个数据. 要求在输出中每行有两个间隔的数字,其中,第一个代表原始数据在原始数据集中的位次,第二个代表原始数据.

mapreduce排序【二次排序】

mr自带的例子中的源码SecondarySort,我重新写了一下,基本没变. 这个例子中定义的map和reduce如下,关键是它对输入输出类型的定义:(java泛型编程) public static class Map extends Mapper<LongWritable, Text, IntPair, IntWritable> public static class Reduce extends Reducer<IntPair, NullWritable, IntWritable,

Map按照条件排序输出

需求: /** * Map进行多条件排序输出* 水果具有好吃不好吃难吃属性.* 入口Map * 首先按照好吃不好吃难吃排序* 然后按照水果的标志Id排序* 出口Map * * 2016年8月14日*/ 1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.Comparator; 4 import java.util.HashMap; 5 import java.util.Iterator;

从“假如有以下几种价格10,20,50,请你代码实现将他们排序输出”看着设计模式中的策略模式

今天重温了一下策略模式,将自己的一些感悟与大家分享...本人只是技术渣渣,所理解的东西的难免会有很大的局限性甚至是错误,还请各位带着批判的眼光去看待....不喜请勿吐槽 定义:策略模式属于设计模式中的对象行为型模式,它将用到的算法单独抽象成一个单独的类.通常,我们在多个类完成同一件事情,仅仅完成的方式不同时,我们可以考虑使用这种设计模式. 举例:相信,很多人在看到"假如有以下几种价格10,20,50,请你代码实现将他们排序输出"这种题目的时候,很快就写出了以下代码,写之前还不忘了问一下

20150920学习内容:结构体及题目:定义一个学生的结构体,学号,姓名,身高,输入学生信息,按身高排序输出

结构体:用户自定义数据类型,实际就是变量组,可以一次存多个不同变量 结构体定义在main函数的外面 Struck 结构体名 { // 元素一 // 元素二 } 题目:定义一个学生的结构体,学号,姓名,身高,输入学生信息,按身高排序输出

定义一个学生的结构体,学号,姓名,身高,输入学生信息。按身高排序输出

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace ConsoleApplication1 { class Program { struct student { public int code;//pu修饰符blic public string name;//结构体成员 public int shengao

任意输入10个int类型数据,排序输出,找出素数

package 排序; import java.util.Arrays; public class Yh { public static void main(String[] args) { int a[]= {1,17,24,21,7,9,8,10,3,14}; Arrays.sort(a); System.out.print("排序输出:"); for(int m=0;m<10;m++) System.out.print(" "+a[m]); System

MapReduce 按照Value值进行排序输出

文件输入: A    1 B    5 C    4 E    1 D    3 W    9 P    7 Q    2 文件输出: W    9 P    7 B    5 C    4 D    3 Q    2 E    1 A    1 代码如下: package comparator; import java.io.IOException; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritabl