我正在使用 mapreduce 构建一个倒排索引(这不需要帮助我解决问题的知识)。为此,我在我的地图函数中使用了一个哈希图,其中包含一个单词在文件中的出现次数,以及它所在的文件以及文件中单词的位置。
输出如下所示:
bart [Bart_the_Murderer.txt.gz{10, 83, 117, ..., 2356}, Bart_the_Murderer.txt.gz{1}]
但应该看起来像这样:
bart [Bart_the_Murderer.txt.gz{1, 10, 83, 117, ..., 2356}]
我构建哈希图的代码:
if (!map.containsKey(tokenForMap)) {
if(filePos == 1 || filePos == 10 || filePos == 83)
LOG.info("no key contained for: " + tokenForMap);
inputStringForMap = INPUTFILE.toString();
inputStringForMap = inputStringForMap + "{" + filePos + "}";
map.put(tokenForMap, inputStringForMap);
}
else
{
if(filePos == 1 || filePos == 10 || filePos == 83)
LOG.info("key contained for: " + tokenForMap);
inputStringForMap = map.get(tokenForMap);
inputStringForMap = inputStringForMap.substring(0, inputStringForMap.length()-1) + ", " + filePos + "}";
map.replace(tokenForMap, inputStringForMap);
}
我的日志是:
[exec] 19/11/22 21:54:04 INFO exercise.BasicInvertedIndex: bart Bart_the_Murderer.txt.gz filepos1
[exec] 19/11/22 21:54:04 INFO exercise.BasicInvertedIndex: no key contained for: bart
[exec] 19/11/22 21:54:04 INFO exercise.BasicInvertedIndex: bart Bart_the_Murderer.txt.gz filepos10
[exec] 19/11/22 21:54:04 INFO exercise.BasicInvertedIndex: no key contained for: bart
[exec] 19/11/22 21:54:04 INFO exercise.BasicInvertedIndex: bart Bart_the_Murderer.txt.gz filepos83
[exec] 19/11/22 21:54:04 INFO exercise.BasicInvertedIndex: key contained for: bart
如您所见, containskey() 似乎并不认为 filepos 10 中的 bart 与 filepos 1 中的 bart 相同,但它认为它与 filepos 83(和其他位置)中的 bart 相同。尽管将文档标记为如下:
String line = value.toString().replaceAll("[^A-Za-z0-9]", " ").toLowerCase();
StringTokenizer itr = new StringTokenizer(line);
由于 barts 应该都是字母数字字符,没有空格(打印时看起来相同),我不明白为什么 containskey 方法不关联它们。我发现有人与 containskey 存在类似问题,但无法在此处识别文件的第一个单词,尽管没有找到解决方案。
感谢任何能够提供帮助的人。