按日期和类别划分地图减少标记计数

时间:2011-06-30 03:06:35

标签: mongodb mapreduce

我仍然试图将我的大脑包裹在地图缩小之前。我有一组文章,每个文章都属于一个类别,每篇文章都有一组关键字。假设文档看起来像这样:

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

对于作者而言,我想基本上从关键字计数的所有文档中提取,所以我最终得到的结果如下:

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

对此的任何意见都将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

哦,我的问题让我感到非常激动!这实际上是我上一次分配给我的分布式系统课程的一部分,所以它在我最近毕业的思想中非常新鲜。

对于解析细节,我只是谷歌Apache的Hadoop教程,但我会给你一般的概述。

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

在第一个reduce pass中,以前的键值对将方便地缩小,以便每个关键字都有自己的<keyword, {1,1,1,1,1,1}>形式的对,其中1的数字代表单词出现的次数所有文件。所以你只需总结1并输出<keyword, sum>

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

现在所有关键字都按照排序顺序排在他们的单词数量旁边!