我正在为mongodb数据库开发一个复杂的map-reduce进程.我已将一些更复杂的代码拆分为模块,然后通过将其包含在我的map中使其可用于我的map/reduce/finalize函数scopeObj:
const scopeObj = {
userCalculations: require('../lib/userCalculations')
}
function myMapFn() {
let userScore = userCalculations.overallScoreForUser(this)
emit({
'Key': this.userGroup
}, {
'UserCount': 1,
'Score': userScore
})
}
function myReduceFn(key, objArr) { /*...*/ }
db.collection('userdocs').mapReduce(
myMapFn,
myReduceFn,
{
scope: scopeObj,
query: {},
out: {
merge: 'userstats'
}
},
function (err, stats) {
return cb(err, stats);
}
)
Run Code Online (Sandbox Code Playgroud)
......一切正常.直到最近我才认为不可能将模块代码包含到map-reduce中scopeObj,但事实证明这只是因为我试图包含的模块都依赖于其他模块.完全独立的模块似乎工作得很好.
这让我(最后)回答了我的问题.我怎么能 - 或者,就此而言,我应该把更复杂的模块,包括我从npm中提取的东西,加入到我的map-reduce代码中?有人认为我曾经使用Browserify或类似的东西将我的所有依赖项拉到一个文件中,然后以某种方式包含它......但我不确定这样做的正确方法是什么.而且我也不确定我在多大程度上冒着严重膨胀我的map-reduce代码的风险,这些代码(由于显而易见的原因)必须高效.
有没有人有经验做这样的事情?如果有的话,它是如何运作的?我在这里走错路吗?
更新:澄清我正在努力克服的问题:在上面的代码中,require('../lib/userCalculations')由Node执行 - 它读入文件../lib/userCalculations.js并将该文件module.exports对象的内容分配给scopeObj.userCalculations.但是,让我们说在内部的require(...)某个地方有一个电话 …
我现在正在做一些数据分析测试,在第一个,非常简单,我有非常奇怪的结果.
这个想法如下:从互联网访问日志(每个访问的文档集合,测试90万个文档).我希望获得域的访问次数(MySQL中的GROUP BY),并获得10个访问最多的域
我在JavaScript中创建的脚本非常简单:
/* Counts each domain url */
m = function () {
emit(this.domain, 1 );
}
r = function (key, values) {
total = 0;
for (var i in values) {
total += Number(i);
}
return total;
}
/* Store of visits per domain statistics on NonFTP_Access_log_domain_visits collection */
res = db.NonFTP_Access_log.mapReduce(m, r, { out: { replace : "NonFTP_Access_log_domain_visits" } } );
db.NonFTP_Access_log_domain_visits.ensureIndex({ "value": 1});
db.NonFTP_Access_log_domain_visits.find({}).sort({ "value":-1 }).limit(10).forEach(printjson);
Run Code Online (Sandbox Code Playgroud)
MySQL中的等价物是:
drop table if exists NonFTP_Access_log_domain_visits;
create table NonFTP_Access_log_domain_visits …Run Code Online (Sandbox Code Playgroud) 我安装了hadoop 1.0.0并尝试了字数统计示例(单节点集群).完成需要2个48秒才能完成.然后我尝试了标准的linux字数统计程序,它在同一组(180 kB数据)上运行10毫秒.我做错了什么,或者Hadoop非常慢?
time hadoop jar /usr/share/hadoop/hadoop*examples*.jar wordcount someinput someoutput
12/01/29 23:04:41 INFO input.FileInputFormat: Total input paths to process : 30
12/01/29 23:04:41 INFO mapred.JobClient: Running job: job_201201292302_0001
12/01/29 23:04:42 INFO mapred.JobClient: map 0% reduce 0%
12/01/29 23:05:05 INFO mapred.JobClient: map 6% reduce 0%
12/01/29 23:05:15 INFO mapred.JobClient: map 13% reduce 0%
12/01/29 23:05:25 INFO mapred.JobClient: map 16% reduce 0%
12/01/29 23:05:27 INFO mapred.JobClient: map 20% reduce 0%
12/01/29 23:05:28 INFO mapred.JobClient: map 20% reduce 4%
12/01/29 23:05:34 INFO mapred.JobClient: …Run Code Online (Sandbox Code Playgroud) 我有几个数字字段需要聚合.假设我的文档结构如下:
_id: 1234,
numValue1: 10,
numValue2: 20,
numValue3: 30,
numValue4: 40
Run Code Online (Sandbox Code Playgroud)
如果我想使用其中一个数字字段向我的管道添加计算字段,我可以这样做:
db.myCollection.aggregate(
{
$project : {
someComputedField : { $add:["$numValue1", 15] }
}
})
Run Code Online (Sandbox Code Playgroud)
如果我想根据其中两个字段添加一个计算字段,我知道我可以这样做:
db.myCollection.aggregate(
{
$project : {
someComputedField : { $add:["$numValue1", "$numValue2"] }
}
})
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是如果我需要做$ numValue1 + $ numValue2 + $ numValue3 + $ numValue4?
或者更有趣的是$ numValue1*($ numValue2 + $ numValue3)/ $ numValue4?
我正在构建一个可以比作约会应用程序的应用程序.
我有一些像这样结构的文件:
$ db.profiles.find().pretty()
[
{
"_id": 1,
"firstName": "John",
"lastName": "Smith",
"fieldValues": [
"favouriteColour|red",
"food|pizza",
"food|chinese"
]
},
{
"_id": 2,
"firstName": "Sarah",
"lastName": "Jane",
"fieldValues": [
"favouriteColour|blue",
"food|pizza",
"food|mexican",
"pets|yes"
]
},
{
"_id": 3,
"firstName": "Rachel",
"lastName": "Jones",
"fieldValues": [
"food|pizza"
]
}
]
Run Code Online (Sandbox Code Playgroud)
我正在努力识别在一个或多个上相互匹配的配置文件fieldValues.
所以,在上面的例子中,我理想的结果看起来像:
<some query>
result:
[
{
"_id": "507f1f77bcf86cd799439011",
"dateCreated": "2013-12-01",
"profiles": [
{
"_id": 1,
"firstName": "John",
"lastName": "Smith",
"fieldValues": [
"favouriteColour|red",
"food|pizza",
"food|chinese"
]
},
{
"_id": 2,
"firstName": …Run Code Online (Sandbox Code Playgroud)