我是hadoop和mapreduce编程的新手,不知道该怎么办。我想在hadoop分区程序中定义一个int数组。我想在主要功能中感觉到这个数组,并在分区器中使用它的内容。我试过使用IntWritable和它的数组,但没有一个没有用。我尝试使用IntArrayWritable,但同样无法正常工作。如果有人帮我,我会很高兴。非常感谢

public static IntWritable h = new IntWritable[1];

public static void main(String[] args) throws Exception {
    h[0] = new IntWritable(1);
}

public static class CaderPartitioner extends Partitioner <Text,IntWritable> {

    @Override
    public int getPartition(Text key, IntWritable value, int numReduceTasks) {
        return h[0].get();
    }
}

最佳答案

如果值的数量有限,则可以通过以下方式进行。
像下面的main方法一样,在配置对象上设置值。

    Configuration conf = new Configuration();
    conf.setInt("key1", value1);
    conf.setInt("key2", value2);

然后为您的Partitioner类实现Configurable接口(interface)并获取配置对象,然后在Partitioner中从中获取键/值
 public class testPartitioner extends Partitioner<Text, IntWritable> implements Configurable{

Configuration config = null;

@Override
public int getPartition(Text arg0, IntWritable arg1, int arg2) {

    //get your values based on the keys in the partitioner
    int value = getConf().getInt("key");
    //do stuff on value

    return 0;
}

@Override
public Configuration getConf() {
    // TODO Auto-generated method stub
    return this.config;
}

@Override
public void setConf(Configuration configuration) {
    this.config = configuration;

 }
}

支持链接
https://cornercases.wordpress.com/2011/05/06/an-example-configurable-partitioner/

请注意,如果文件中包含大量值,那么最好找到一种方法来从Partitioner中的作业对象获取缓存文件

09-26 15:25