映射减少按日期和类别划分范围的标记计数



我仍在努力让我的大脑围绕map reduce。我有一个文章集,每一篇都属于一个类别,每篇文章都有一组关键词。假设文档如下所示:

{
  author: "kris",
  category: "mongodb",
  content: "...",
  keywords: [ "keyword1", "keyword2", "keyword3" ],
  created_at: "..."
}

我想从所有文档中提取关于作者的关键词计数,所以我最终得到了这样的结果:

{
  author: "kris",
  categories: {
    mongodb: { keyword1: 5, keyword2: 3, keyword3: 1 },
    ruby: { ... },
    python: { ... }
  }
}

如有任何意见,我们将不胜感激。

谢谢!

哦,你的问题让我激动不已!这实际上是我在分布式系统课上最后一次作业的一部分,所以在我刚毕业的时候,它对我来说很新鲜。

关于解析细节,我只想在谷歌上搜索Apache的Hadoop教程,但我会给你一个大致的概述。

基本上,这个问题需要两个Map Reduce阶段。在第一个映射中,您的输入应该是<filename, {list of keywords}>键值对的列表(可能需要对文件进行lil预处理,但没有什么大不了的)。对于这些对中的每一个,您输出<keyword, 1>作为要交给reducer的对(您基本上说的每个单词都应该计数一次)。

在第一次reduce过程中,之前的键值对将被方便地浓缩,使得每个关键字都有其自己的形式为<keyword, {1,1,1,1,1,1}>的对,1的数量表示该词在所有文档中出现的次数。所以你只需要把1加起来,然后输出<keyword, sum>

最后的map/reduce阶段只是根据关键字的值对其进行排序。地图:<keyword,sum> --> <sum,keyword> Reduce: <sum, {keywords}> --> <keyword,sum>。这利用了映射reduce在传递到reduce阶段时按键排序的事实。

现在,所有的关键词都按排序顺序排列在它们的字数旁边!

相关内容

  • 没有找到相关文章

最新更新