如何在hadoop分区器中定义数组

时间:2016-09-19 17:25:03

标签: arrays hadoop mapreduce

我是hadoop和mapreduce编程的新手,不知道该怎么做。我想在hadoop分区器中定义一个int数组。我想在main函数中感觉这个数组并在分区器中使用它的内容。我曾尝试使用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();
    }
}

2 个答案:

答案 0 :(得分:1)

这是分区程序的重构版本。主要变化是:

  1. 删除了不需要的main(),初始化应该在构造函数中完成
  2. 从类和成员变量中删除了静态
  3. public class CaderPartitioner extends Partitioner<Text,IntWritable> {
    
        private IntWritable[] h;
    
        public CaderPartitioner() {
            h = new IntWritable[1];
            h[0] = new IntWritable(1);
        }
    
        @Override
        public int getPartition(Text key, IntWritable value, int numReduceTasks) {
            return h[0].get();
        }
    }
    

    备注:

    • h不需要是可写的,除非您在问题中未包含其他逻辑。
    • 目前还不清楚h[]是什么,你打算配置它吗?在这种情况下,分区程序可能需要implement Configurable,因此您可以使用Configurable对象以某种方式设置阵列。

答案 1 :(得分:1)

如果您的数量有限,您可以采用以下方式。 在main方法中设置配置对象上的值,如下所示。

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

然后为Partitioner类实现Configurable接口并获取配置对象,然后在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/

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