我是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();
}
}
答案 0 :(得分:1)
这是分区程序的重构版本。主要变化是:
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
对象以某种方式设置阵列。答案 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/
请注意,如果文件中包含大量值,那么最好找到一种从分区程序中的作业对象中获取缓存文件的方法