我可以获得Hadoop的分区号吗?

时间:2014-04-26 17:21:43

标签: hadoop mapreduce hadoop-partitioning

我是hadoop新手。

我想在输出文件上获得分区号。

起初,我制作了一个自定义分区程序。


public static class MyPartitioner extends Partitioner<Text, LongWritable> {

    public int getPartition(Text key, LongWritable value, int numReduceTasks) {

    int numOfChars = key.toString().length();
        return numOfChars % numReduceTasks;
    }
}

有效。但是,我想在Reducer上“直观地”输出分区号。

如何获得分数?

以下是我的减速机来源。


public static class MyReducer extends Reducer<Text, LongWritable, Text, Text>{

    private Text textList = new Text();

    public void reduce(Text key, Iterable<LongWritable> values, Context context)
      throws IOException, InterruptedException {

        String list = new String();

            for(LongWritable value: values) {
                list = new String(list + "\t" + value.toString());
            }

            textList.set(list);

            context.write(key, textList);

    }

}

我想分别在'list'上放一个分区号。会有'0'或'1'。

list = new String(list + "\t" + value.toString() + "\t" + ??);

如果有人帮助我会很棒。

+

感谢答案,我得到了一个解决方案。但是,它没有用,我认为我做错了。

以下是修改后的MyPartitioner。


public static class MyPartitioner扩展了Partitioner {

    public int getPartition(Text key, LongWritable value, int numReduceTasks) {

        int numOfChars = key.toString().length();
        return numOfChars % numReduceTasks;

        private int bring_num = 0;      
        public void configure(JobConf job) {
            bring_num = jobConf.getInt(numOfChars & numReduceTasks);
}

    }

}

1 个答案:

答案 0 :(得分:0)

将以下代码添加到Reducer类中,以获取类变量中的分区号,稍后可以在reducer方法中使用该变量。

String partition;
protected void setup(Context context) throws IOException,
    InterruptedException {
    Configuration conf = context.getConfiguration();
    partition = conf.get("mapred.task.partition");
}