我仍在努力让我的大脑围绕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阶段时按键排序的事实。
现在,所有的关键词都按排序顺序排列在它们的字数旁边!