gpt4 book ai didi

java - MapReduce Hadoop StringTokenizer 获取 NoSuchElementException

转载 作者:可可西里 更新时间:2023-11-01 15:30:08 25 4
gpt4 key购买 nike

我正在尝试使用 wordcount 的输出文件作为 MapReduce 的输入文件,它将显示每个计数有多少(有多少单词出现一次、两次、三次等)。

我想使用每个单词的计数作为键,1 作为值,跳过单词本身。

如果输入文件是这样的:

422
apple 3
fruit 2
gorilla 9
monkey 3
zebra 12

输出应该是:

2 1
3 2
9 1
12 1

使用StringTokenizer打散文件,下面map函数中的nextToken()给出NoSuchElementException

public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{

private final static IntWritable one = new IntWritable(1);
private Text count = new Text();

public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
itr.nextToken(); // Skip over first line, which has just one element
while (itr.hasMoreTokens()) {
itr.nextToken(); // Skip over word
count.set(itr.nextToken()); // save count as key
context.write(count, one);
}
}
}

我不确定为什么或如何解决它?

最佳答案

欢迎来到 StackOverflow joanne 和 MapReduce 编程!

我想原因是您总是跳过第一个 token 并要求接下来的两个。您为每一行 执行此操作。

请记住,映射会针对输入的不同部分并行运行,而不是按顺序运行,从第 1 行开始,然后转到第 2 行。每次,StringTokenizer 仅针对一行调用,而不是针对整个输入.话虽如此,您的问题的解决方案如下:

public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString()); // each time the value is a different line
if (itr.countTokens() == 2) { //this skips the first line and other lines that possible contain one word
itr.nextToken(); // Skip over word
count.set(itr.nextToken()); // save count as key
context.write(count, one);
}
}

PS1:您还可以使用 String.split()方法,但这取决于你。

PS2:根据您的数据和要求,您还可以考虑将 key 写为 IntWritableVIntWritable(解析速度较慢String as int,但传输到网络的速度更快,内存消耗更低)。

关于java - MapReduce Hadoop StringTokenizer 获取 NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35390847/

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