0

我正在使用 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 存在类似问题,但无法在此处识别文件的第一个单词,尽管没有找到解决方案。

感谢任何能够提供帮助的人。

4

1 回答 1

0

您可以使用以下命令代替 map.containsKey(..):

   map.get(key)

如果它返回 null,这意味着它不包含这个键。

     if (map.get(key)==null){
        ....
            }
     else {
          }

这应该做同样的事情。我提出这个解决方案,假设 containsKey 是你提到的问题。

于 2019-11-22T22:30:56.890 回答