我是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中的作业对象获取缓存文件