2012-08-15 6 views
1

큰 컬렉션을 더 작은 조각으로 집계하고 타임 스탬프별로 그룹화하는 데 사용하는 python 스크립트 마녀에 문제가 있습니다. 당신이 볼 수 있듯이MongoDB MapReduce, 날짜 및 % 연산자

map = Code("function(number) {" 
    "emit({" 
     "ts : new Date(new Date((this.ts - (this.ts % (60 * number))) * 1000).setSeconds(0))" 
    "}, 1);" 
"}") 

reduce = Code("function(key, vals) {" 
    "var sum = 0;" 
    "for (var i in vals) {" 
     "sum += vals[i]" 
    "}" 
    "return sum;" 
"}") 

, 그것은 매우 간단 맵리 듀스와 타임 스탬프 (TS) 분의 애니 지정된 수에 의해 그룹화해야합니다. 나는 여기에 http://jsfiddle.net/QgMzK/1/ 자바를 테스트했습니다 그리고 그것은 잘 작동하는 것 같습니다. 하지만 파이썬에서 실행하면 모든 타임 스탬프가 ISODate ("1970-01-01T00 : 00 : 00Z")가됩니다.

아이디어가 있으십니까? number, 호출 할 때, null로 설정되고 날짜를 만들 것입니다 coertion (그리고 0으로 일부 %) 후지도 ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ")을 반환지도-감소 :

답변

3

당신의지도 기능은 하나 개의 매개 변수를 사용합니다. 이 유형 변환 후는 datetime.datetime(1970, 1, 1, 0, 0)이됩니다.

매개 변수를 제거하면 올바르게 작동합니다. ,

{u'_id': {u'ts': None}, u'value': 10.0} 

ts 그 결과에 None입니다 :

편집

는 다음 사항을 확인이 코드를 실행하려고합니다 : 내 컴퓨터에 결과가

from pymongo import Connection 
from bson.code import Code 

db = Connection().mr_test 
for i in xrange(10): 
    db.things.insert({"x" : i}) 


map = Code("function(number) {" 
    "emit({" 
     "ts : number" 
    "}, 1);" 
"}") 

reduce = Code("function(key, vals) {" 
    "var sum = 0;" 
    "for (var i in vals) {" 
     "sum += vals[i]" 
    "}" 
    "return sum;" 
"}") 


result = db.things.map_reduce(map, reduce, "test_results") 
for doc in result.find(): 
    print doc 

입니다

을 원인 number은 매핑 기능이 실행될 때 설정되지 않았습니다.

map에 매개 변수를 전달하는 유일한 방법 AFAIK 편집이

map_reducescope 선택적 매개 변수를 사용하는 것입니다,하지만 당신은 어쨌든지도 서명에서 제거해야합니다.

map = Code("function() {" 
    "emit({" 
     "ts : new Date(new Date((this.ts - (this.ts % (60 * number))) * 1000).setSeconds(0))" 
    "}, 1);" 
"}") 

및 호출하여 : :에지도를 변경하여

그래서

db.whatever.map_reduce(map, reduce, "collection_name", scope = {"number" : the_value_your_function_needs}) 

당신은 당신이 원하는 결과를 얻을 수 있습니다.

+0

map 함수의 number 매개 변수는 가장 가까운 5, 10 또는 X 분으로 모음을 그룹화 할 수 있도록되어 있습니다. ts-prop를 ex, ts :로 변경하면 매개 변수가 제대로 작동합니다. 호의적 인 @ Jarsäter 인 –

+0

@ Jarsäter는 map-reduce 결과의 유일한 키로 'None'을 반환합니다. 전체적으로 일치합니다. 내 대답과 함께. – soulcheck

관련 문제