python使用mongo的mapreduce实现简单的统计和group by操作,mapreduce的效率还是非常高的,替代sql里面的group by
mongo里面的数据是这样的: doc1 = { “freq”:1 ….. } doc2 = { “freq”:3 ….. } 要求是统计出freq=1的文档个数,freq=2的文档的个数。。。 典型的mapreduce任务,正好试试mongo的mapreduce。 感觉还行,做一些简单的聚集操作还凑活,看看回头有没有更复杂一些的应用。
#!/usr/bin/env python
import pymongo
from bson.code import Code
 
def calc_freq_distribution(collection_handler):
    out_collection_name = collection_handler.name+’_freqdist’
    map = Code(“function () {”
                ”emit(this.freq, {count:1});”
                ”}”)
 
    reduce = Code(“function (key, values) {”
                   ”  var total =”
                   ”  for (var i = i                    ”    total += values[i].count;”
                   ”  }”
                   ”  return {count:total};”
                   ”}”)
    result = collection_handler.map_reduce(map, reduce, out = out_collection_name)
    fname = out_collection_name+’.csv’
    with open(fname, ’w’) as f:
        for doc in result.find():
            f.write(‘,’.join([str(doc[‘_id’]), str(doc[‘value’][‘count’])])+’\n’)
 
if __name__ == ’__main__’:
    conn = pymongo.Connection([‘192.168.1.1’], 27018)
    input_collection= conn.cname.things
    print calc_freq_distribution(merge_spam)
 
    merge_ham = conn.antispam.mergeham
    print calc_freq_distribution(merge_ham)