相关疑难解决方法(0)

MongoDB map-reduce(通过nodejs):如何在scopeObj中包含复杂模块(带有依赖项)?

我正在为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(...)某个地方有一个电话 …

javascript mapreduce mongodb node.js npm

10
推荐指数
1
解决办法
393
查看次数

使用MongoDB的MapReduce确实非常慢(对于等效的数据库,在MySQL中30小时vs 20分钟)

我现在正在做一些数据分析测试,在第一个,非常简单,我有非常奇怪的结果.

这个想法如下:从互联网访问日志(每个访问的文档集合,测试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 mapreduce mongodb

8
推荐指数
2
解决办法
4659
查看次数

Hadoop性能

我安装了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)

performance hadoop mapreduce

5
推荐指数
2
解决办法
8604
查看次数

MongoDB Aggregation Framework $ group使用嵌套操作

我有几个数字字段需要聚合.假设我的文档结构如下:

_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?

mongodb aggregation-framework

1
推荐指数
1
解决办法
1762
查看次数

MongoDB - 使用聚合框架或mapreduce匹配文档中的字符串数组(配置文件匹配)

我正在构建一个可以比作约会应用程序的应用程序.

我有一些像这样结构的文件:

$ 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)

mapreduce mongodb aggregation-framework

1
推荐指数
1
解决办法
5481
查看次数