我现在已经和它斗争了大约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作业来说,这似乎是一个完美的用例,但是我无法完全知道如何做到这一点。
是否有人愿意帮助我解决这个问题?
答案 0 :(得分:1)
基本上,这与mapreduce中众所周知的单词频率问题相同,但是使用散列(以及对原始条目的引用)而不是使用单词:
地图:
中间体:
减少
答案 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);