如何设计MapReduce伪代码来计算单词出现的文档数量?

时间:2015-05-13 14:14:05

标签: hadoop mapreduce

我需要知道这个问题的解决方案,但我需要一些帮助,因为我无法弄明白。谢谢你的时间。

如何修改映射器功能,以便程序计算每个不同单词的文档频率(即包含该单词的文档数量)?

 class MAPPER
 method MAP(docid i, doc d)
 for all term t ∈ doc d do 
 EMIT(term t, count 1)

 class REDUCER
 method REDUCE(term t, counts [c1, c2, . . .])
 sum ← 0
 for all count c ∈ counts [c1,c2,...] do
 sum ← sum + c 
 EMIT(term t, count sum)

我的解决方案,但我不知道它是否正确。

 class MAPPER
 method MAP(docid i, doc d)
   for all term t ∈ doc d do
     for all document d ∈ doc d do
      EMIT(term t, count + 1)

1 个答案:

答案 0 :(得分:1)

我希望以下步骤对您有所帮助。我只是向您简要介绍一下这个想法,您可以将其转换为算法。

  • 首先,您必须找到输入拆分的文件名 由mapper在mapper类的setup()方法中处理。参考 下面的代码段,

    String fileName = ((FileSplit) context.getInputSplit()).getPath().toString();
    
  • 从Mapper类的map()方法中,将每个单词作为键发出 value作为与setup()和int中找到的文件名对齐的字符串 价值1。

  • 从您的Reducer类reduce()方法中,为每个不同的单词 您将获得每个字符串将包含的字符串列表 相应的文件名和计数1。
  • 迭代每个键的值列表,并拆分每个值, 然后将文件名存储在非重复的本地集合中,如HashSet 并计算1的总和。
  • 迭代值列表后,您将获得所有值的总和 count 1以及具有当前不同文件名的HashSet 键。这里HashSet的大小将是文档的频率 键。
  • 从reducer中发出键,字数和文档频率,然后重置sum变量和HashSet。