MapReduce wordcount获取唯一键

时间:2017-08-01 19:00:33

标签: mapreduce

我试着理解MapReduce如何处理最简单的例子:wordcount。

取“我是新手,我吃土豆”这句话。

我把它分成两部分,“我是一个新手”和“我吃了一个土豆”,我送给两个地图制作者。这些地图制作者回答我:

I --> 1
am --> 1
a --> 1
newbie --> 1

表示第一个和

and --> 1
I --> 1
eat --> 1
a --> 1
potato --> 1

为第二个。

所以现在,在主人身上我有这个数据:

I --> 1
am --> 1
a --> 1
newbie --> 1
and --> 1
I --> 1
eat --> 1
a --> 1
potato --> 1

但是我的减速器在入口处采用了Map,也就是说密钥是唯一的。所以我必须将我拥有的数据转换为:

I --> 1, 1
am --> 1
a --> 1, 1
newbie --> 1
and --> 1
eat --> 1
potato --> 1

然后我的减速器只是对数字求和。

这似乎是算法中最重要的部分,因为在这里完成了所有工作。非常令人惊讶的是,我无法在互联网上找到任何相关信息。它们都提供了图表和图表,其阶段是“排序和改组”(洗牌只是将数据发送到正确的减速器,排序是按键排序?)但仅此而已。

这个阶段如何运作?谁在照顾这个?它是映射的另一个阶段,还是主人自己完成工作?

2 个答案:

答案 0 :(得分:0)

如果我理解正确你想要加上每个键的数字?

您目前有一个word:arrayOfNumbers对数组,您希望映射到word:totalOccurrances对数组。

您必须每个arrayOfNumbers减少到totalOccurrances。

类似

keyArrayPairs.map(array => array.reduce((result, value) => result + value, 0))

修改

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce 当你减少一个对象时,解析函数的一个参数就是关键。你可以做点什么

array.reduce((result, value, word) => {
  if(result[word]){
    result.push(value[0]) 
  }else{
    result[word]=value
  }
  return result
},{}) // Empty object

答案 1 :(得分:0)

  

所以我必须将我拥有的数据转换为:

不,你没有! MapReduce为您完成此任务。您所要做的就是提供map和reduce函数,以便为每个阶段创建正确的键和值。您将在map函数中创建的输出键(key = word,value = 1)就是您所要做的。然后,MapReduce(不是你)将按键对这些键值对进行分组,在reduce函数中,您只需定义要对具有相同键的每组键值对进行的操作(即,使用所有1的键值对)已被分组为同一个单词)。答案是你要对它们求和,以便得到每个单词的最终频率。

另外,声明:

  

所以现在,在主人身上我有这个数据:

错了。主人对键值对一无所知。如果您不在群集上工作,请假设群集中的每台计算机只知道同一节点已处理的内容,仅此而已。阅读更多关于MapReduce如何工作的内容,如果您没有第一次使用它,请不要担心。需要一段时间才能习惯这种逻辑。您应该始终将程序视为在群集上运行而不是在单台计算机上运行的分布式程序。