我是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
这是分区程序的重构版本。主要变化如下:
- 删除不需要的
main()
,初始化应该在构造函数中完成 - 从类和成员变量中删除静态
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
对象以某种方式设置数组。