我需要知道该问题的解决方案,但由于无法解决,因此需要一些帮助。谢谢你的时间。

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

 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)

最佳答案

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

  • 首先,您必须找到输入拆分的文件名
    由mapper在您的mapper类的setup()方法中处理。引用
    在摘要下方,
    String fileName = ((FileSplit) context.getInputSplit()).getPath().toString();
    
  • 从您的Mapper类的map()方法中,发出每个单词作为键,然后
    值为在setup()和int中找到的与文件名一致的字符串
    值1.
  • 从Reducer类的reduce()方法中,为每个不同的词
    您将获得字符串列表,其中每个字符串都将包含
    对应的文件名和计数1.
  • 遍历每个键的值列表,并拆分每个值,
    然后将文件名存储在不可重复的本地集合中,例如HashSet
    并计算总和1。
  • 对值列表进行迭代后,您将获得所有值的总和
    计数1,还有一个HashSet,它具有当前文件的不同文件名
    键。在这里,HashSet的大小将是
    键。
  • 从reducer发出键,单词数和文档频率,然后重置sum变量和HashSet。
  • 关于hadoop - 如何设计MapReduce伪代码以计算单词出现的文档数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30217491/

    10-16 01:33