如何在hadoop分区中定义数组



我是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();
    }
}

如果值的数量有限,则可以按以下方式进行操作。在main方法中按如下方式设置配置对象上的值。

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

然后为您的Partitioner类实现可配置接口,并获得配置对象,然后从它在您的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

中的作业对象中获取缓存文件。

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

  1. 删除不需要的main(),初始化应该在构造函数中完成
  2. 从类和成员变量中删除静态

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对象以某种方式设置数组。

相关内容

  • 没有找到相关文章