Java MapReduce:如果值不高于阈值,则过滤掉键值对

Java MapReduce:如果值不高于阈值,则过滤掉键值对,java,hadoop,filter,mapreduce,Java,Hadoop,Filter,Mapreduce,使用MapReduce,如何修改以下字数代码,使其仅输出高于某个计数阈值的字数?(例如,我想添加某种类型的键值对过滤。) 输入: ant bee cat bee cat dog cat dog 输出:假设计数阈值为2或更多 cat 3 dog 2 以下代码来自: 公共静态类Map1扩展MapReduceBase实现Mapper{ 私有最终静态IntWritable one=新的IntWritable(1); 私有文本字=新文本(); 公共void映射(LongWritable键、文本值、O

使用MapReduce,如何修改以下字数代码,使其仅输出高于某个计数阈值的字数?(例如,我想添加某种类型的键值对过滤。)

输入:

ant bee cat
bee cat dog
cat dog
输出:假设计数阈值为2或更多

cat 3
dog 2

以下代码来自:

公共静态类Map1扩展MapReduceBase实现Mapper{
私有最终静态IntWritable one=新的IntWritable(1);
私有文本字=新文本();
公共void映射(LongWritable键、文本值、OutputCollector输出、Reporter报告器)引发IOException{
字符串行=value.toString();
StringTokenizer标记器=新的StringTokenizer(行);
while(tokenizer.hasMoreTokens()){
set(tokenizer.nextToken());
输出。收集(字,一);
}
}
}
公共静态类Reduce1扩展MapReduceBase实现Reducer{
公共void reduce(文本键、迭代器值、OutputCollector输出、Reporter报告器)引发IOException{
整数和=0;
while(values.hasNext()){
sum+=values.next().get();
}
collect(key,newintwriteable(sum));
}
}

编辑:RE:关于输入/测试用例

输入文件(“example.dat”)和一个简单的测试用例(“testcase”)如下所示:


编辑:

问题不在于代码。这是由于
org.apache.hadoop.mapred
包之间的一些奇怪行为造成的。()


要点:使用
org.apache.hadoop.mapreduce
代替在reduce中收集输出之前尝试添加if语句

if(sum >= 2)
    output.collect(key, new IntWritable(sum));

您只需在Reduce1类中执行过滤:

if (sum>=2) {
    output.collect(key. new IntWritable(sum));
}

当我做这样的事情时,我会错过大约一半的预期产出。Reducer不收集/发出键值对是否合理?不,不应该发生这种情况。你能为这个问题提供更多的细节吗?当我尝试你的建议时(在实际输入'example.dat'——见上面的链接),我期望单词“0”的计数为594。但是,当我将阈值设置为590时,没有返回此值的计数。请您构造一个简单、易于验证的测试用例,好吗?我已在以下位置创建了一个简单的测试:。。还有运行MapReduce的TestCase.java代码。当我这样做时,我缺少了大约一半的预期输出。Reducer不收集/发出键值对是否合理?能否显示导致此问题的一些输入行?问题是在我对单词“0”进行抽查时发现的--我预期计数为594,但设置阈值为590时未返回计数。
if (sum>=2) {
    output.collect(key. new IntWritable(sum));
}