gpt4 book ai didi

java - 根据单词的长度在reducer上分类

转载 作者:行者123 更新时间:2023-12-02 22:04:58 25 4
gpt4 key购买 nike

我是MapReduce应用程序的新手。我只是想在我的数据集上找到单词的长度,然后根据它们的长度将它们分为小,小,中等,巨大。最后,我想查看总数为小,小,中等的单词总数或Java中的数据集很大,但是在实现reducer时遇到问题。当我在Hadoop群集上执行jar文件时,它不会返回任何结果。如果有人帮助我,我将不胜感激。这是我尝试执行的reducer代码,但我猜有很多错误。

public class WordSizeReducer extends Reducer<IntWritable, IntWritable, Text, IntWritable> {
private IntVariable result = new IntVariable();
IntWritable tin, smal, mediu,bi;
int t, s, m, b;
int count;
Text tiny, small, medium, big;

public void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{

for (IntWritable val:values){
if(val.get() == 1){
tin.set(t);
t++;
}
else if(2<=val.get() && val.get()<=4){
smal.set(s);
s++;
}
else if(5<=val.get() && val.get()<=9){
mediu.set(m);
m++;
}
else if(10<=val.get()){
bi.set(b);
b++; }

}
context.write(tiny, tin);
context.write(small, smal);
context.write(medium, mediu);
context.write(big, bi);
}
}

public class WordSizeMapper extends Mapper<LongWritable, Text, IntWritable, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private IntWritable wordLength = new IntWritable();

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
wordLength.set(tokenizer.nextToken().length());
context.write(wordLength, one);
}
}
}

最佳答案

tinysmallmediumbig从未初始化,因此它们将为null。

这意味着您所有的context.write()调用都使用空键。

显然,这不好,因为您将无法区分不同字长的计数。

更糟糕的是,从未初始化tinsmalmediubi,这将在您尝试在其上调用NullPointerException时导致set() s(正确初始化result,但从不使用它)。

(此外,您不需要在循环中对值重复设置IntWritables;只需更新t,s,m,b,然后在IntWritable调用之前最后一次设置context.write()即可)

现在更新该映射器代码:

对于输入中的每个单词,您正在编写键值对(长度为1)。

reducer将使用相同的键收集所有值,因此将使用调用它,例如:

(2, [1,1,1,1,1,1,1,1,])
(3, [1,1,1])

因此, reducer 只会看到值“1”,该值被错误地视为字长。实际上,关键是单词长度。

现在更新,其中添加了堆栈跟踪:

该错误消息说明了错误所在-Hadoop无法找到您的作业类,因此它们根本没有被执行。错误提示:
java.lang.ClassNotFoundException: WordSize.WordsizeMapper

但是您的类称为 WordSizeMapper(如果您有外部类,也可以称为 WordSize.WordSizeMapper)-注意“size” /“Size”的大小写不同!您需要检查如何调用Hadoop。

关于java - 根据单词的长度在reducer上分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28257505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com