这看起来像MapReduce的工作......但我无法理解

时间:2010-12-10 22:36:43

标签: javascript arrays mongodb mapreduce nosql

我现在已经和它斗争了大约2天了,任何帮助都会非常感激。我目前有一个非常大的MongoDB集合(超过100M文档),格式如下:

[_id]
[date]
[score]
[meta1]
[text1]
[text2]
[text3]
[text4]
[meta2]

这不是那里的确切数据,为了这篇文章的目的,我对它进行了一些模糊处理,但模式是相同的,并且没有数据的格式无法改变,这就是它的方式

其中有一些TON重复条目,每天运行一次作业,向数据库添加数百万个条目,这些条目可能在文本字段中具有相同的数据,但得分,meta1和meta2字段的值不同。因此,我需要消除重复内容并将所有内容整合到一个集合中,而不会出现重复文本:

首先,我将连接文本字段并对结果进行哈希处理,因此我没有包含相同文本字段的重复项(这部分很简单且已经有效)。

这是我正在努力的地方:结果集合将包含每个唯一meta1的数组,而meta1又是一个包含与之匹配的日期和分数的数组。

所以,如果我现在收藏了以下三个文件:

[_id] => random mongoid
[date] => 12092010 
[score] => 3
[meta1] => somemetadatahere
[text1] => foo
[text2] => bar
[text3] => foo2
[text4] => bar2
[meta2] => uniquemeta2data

[_id] => random mongoid
[date] => 12092010
[score] => 5
[meta1] => othermetadata
[text1] => foo
[text2] => bar
[text3] => foo2
[text4] => bar2
[meta2] => uniquemeta2data1

[_id] => random mongoid
[date] => 12102010
[score] => 7
[meta1] => somemetadatahere  (same meta1 as the first document)
[text1] => foo
[text2] => bar
[text3] => foo2
[text4] => bar2
[meta2] => uniquemeta2data

它们应该缩减为此集合(缩进是嵌套文档/数组)。数据数组中的键来自原始集合中meta1字段的值:

[_id]=> (md5 hash of all the text fields)
[text1] => foo
[text2] => bar
[text3] => foo2
[text4] => bar2    
[datas]
    [somemetadatahere]
        [meta2] => uniquemeta2data
        [scores]
            [12092010]=>3
            [12102010]=>7
    [othermetadata]
        [meta2] => uniquemeta2data1   
        [scores]
            [12092010]=>3     

对于MapReduce作业来说,这似乎是一个完美的用例,但是我无法完全知道如何做到这一点。

是否有人愿意帮助我解决这个问题?

2 个答案:

答案 0 :(得分:1)

基本上,这与mapreduce中众所周知的单词频率问题相同,但是使用散列(以及对原始条目的引用)而不是使用单词:

  • Map:获取每个条目的哈希并将其映射到这对(hash,1)。 (要检索原始条目:创建对象并将原始条目用作属性)。
  • Reduce:所有哈希条目都将收集到同一个桶中, 计算每对(hash,1)的值。
  • 输出哈希值,原始条目(存储在对象中)和计数

类比:猫坐在垫子上

地图:

  • - (hash(the),1)
  • cat - > (哈希(猫),1)
  • sat - > (哈希(sat),1)
  • on - > (hash(on),1)
  • - (hash(the),1)
  • mat - > (hash(mat),1)

中间体:

  • - (hash(the),1)
  • cat - > (哈希(猫),1)
  • sat - > (哈希(sat),1)
  • on - > (hash(on),1)
  • - (hash(the),1)
  • mat - > (hash(mat),1)

减少

  • (hash(the),2)
  • (哈希(猫),1)
  • (hash(sat),1)
  • (hash(on),1)
  • (hash(mat),1)

答案 1 :(得分:0)

我认为MapReduce问题似乎很简单,这意味着我可能会误解你的问题。无论如何,这就是我的看法。

根据文本哈希划分原始集合。让每个部分都专注于组合生成的子集。

以下是http://www.dashdashverbose.com/2009/01/mapreduce-with-javascript.html

中的一些代码

我会尝试编辑它以适合您的问题。

function myMapper(key, value) {
 var ret = [];
 var words = normalizeText(value).split(' ');
 for (var i=0; i<words.length; i++) {
  ret.push({key:words[i], value:1});
 }
 return ret;
}

function myReducer(intermediateKey, values) {
 var sum = 0;
 for (var i=0; i<values.length; i++) {
  sum += values[i];
 }
 return {key:intermediateKey, value:sum};
}

function normalizeText(s) {
 s = s.toLowerCase();
 s = s.replace(/[^a-z]+/g, ' ');
 return s;
}

var i = {};
i.atxt = "The quick brown fox jumped over the lazy grey dogs.";
i.btxt = "That's one small step for a man, one giant leap for mankind.";
i.ctxt = "Mary had a little lamb, Its fleece was white as snow; And everywhere that Mary went, The lamb was sure to go.";

var out = mapReduce(i, myMapper, myReducer);