MongoDB Map Reduce
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MongoDB Map Reduce,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4406字,纯文字阅读大概需要7分钟。
内容图文
![MongoDB Map Reduce](/upload/InfoBanner/zyjiaocheng/468/30e19c933cfa4db4a6b97e3dd03797ee.jpg)
使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调用 emit(key, value), 遍历 collection 中所有的记录, 将key 与 value 传递给 Reduce 函数进行处理。
Map 函数必须调用 emit(key, value) 返回键值对。
参数说明:
- map :映射函数 (生成键值对序列,作为 reduce 函数参数)。
- reduce 统计函数,reduce函数的任务就是将key-values变成key-value,也就是把values数组变成一个单一的值value。。
- out 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
- query 一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合)
- sort 和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
- limit 发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)
插入测试数据:
for i in xrange(1000):
rID=math.floor(random.random()*10);
price = round(random.random()*10,2);
if rID < 4:
db.test.insert({"_id":i,"user":"Joe","product":rID,"price":price});
elif rID>=4 and rID<7:
db.test.insert({"_id":i,"user":"Josh","product":rID,"price":price});
else:
db.test.insert({"_id":i,"user":"Ken","product":rID,"price":price});
结果数据为:
{ "_id" : 0, "price" : 5.9, "product" : 9, "user" : "Ken" }
{ "_id" : 1, "price" : 7.59, "product" : 7, "user" : "Ken" }
{ "_id" : 2, "price" : 4.72, "product" : 0, "user" : "Joe" }
{ "_id" : 3, "price" : 1.35, "product" : 1, "user" : "Joe" }
{ "_id" : 4, "price" : 2.31, "product" : 0, "user" : "Joe" }
{ "_id" : 5, "price" : 5.29, "product" : 5, "user" : "Josh" }
{ "_id" : 6, "price" : 3.34, "product" : 1, "user" : "Joe" }
{ "_id" : 7, "price" : 7.2, "product" : 4, "user" : "Josh" }
{ "_id" : 8, "price" : 8.1, "product" : 6, "user" : "Josh" }
{ "_id" : 9, "price" : 2.57, "product" : 3, "user" : "Joe" }
{ "_id" : 10, "price" : 0.54, "product" : 2, "user" : "Joe" }
{ "_id" : 11, "price" : 0.66, "product" : 1, "user" : "Joe" }
{ "_id" : 12, "price" : 5.51, "product" : 1, "user" : "Joe" }
{ "_id" : 13, "price" : 3.74, "product" : 6, "user" : "Josh" }
{ "_id" : 14, "price" : 4.82, "product" : 0, "user" : "Joe" }
{ "_id" : 15, "price" : 9.79, "product" : 3, "user" : "Joe" }
{ "_id" : 16, "price" : 9.6, "product" : 5, "user" : "Josh" }
{ "_id" : 17, "price" : 4.06, "product" : 7, "user" : "Ken" }
{ "_id" : 18, "price" : 1.37, "product" : 5, "user" : "Josh" }
{ "_id" : 19, "price" : 6.77, "product" : 9, "user" : "Ken" }
测试1、每个用户各购买了多少个产品?
用SQL语句实现为:select user,count(product) from test group by user
//MapReduce实现
map=function (){
emit(this.user,{count:1})
}
reduce = function (key, values){
var total = 0;
for (var i = 0; i < values.length; i++)
{
total += values[i].count;
}
return {count:total};
}
result = db.test.mapReduce(map,reduce,{out: ‘re‘})
执行结果:
查询 out结果:
2、每个用户不同的产品购买了多少个?(复合Key做re)
SQL实现:select user,product,count(*) from test group by user,product
MapReduce 实现:
map = function (){
emit({user:this.user,product:this.product},{count:1})
}
reduce = function (key, values){
var total = 0;
for (var i = 0; i < values.length; i++)
{
total += values[i].count;
}
return {count:total};
}
执行:result = db.test.mapReduce(map,reduce,{out: ‘re2‘})
查询结果re2:
3. 每个用户购买的产品数量,总金额是多少?(复合Reduce结果处理)
SQL实现为:select user,count(product),sum(price) from test group by user
MapReduce实现:
map=function (){
emit(this.user,{amount:this.price,count:1})
}
reduce = function (key, values){
var res={amount:0,count:0};
for (var i = 0; i < values.length; i++)
{
res.count += values[i].count;
res.amount += values[i].amount;
}
res.count = Math.round(res.count,2);
res.amount = Math.round(res.amount,2);
return res;
}
执行:db.test.mapReduce(map,reduce,{out:"re3"})
查询re3:
4、在3中返回的amount的float精度需要改成两位小数,还需要得到商品的平均价格。(使用Finalize处理reduce结果集)
SQL实现:select user,count(sku),sum(price),round(sum(price)/count(sku),2) as avgPrice from test group by user
MapReduce实现:
MongoDB Map Reduce
标签:
本文系统来源:http://www.cnblogs.com/shaosks/p/5684906.html
内容总结
以上是互联网集市为您收集整理的MongoDB Map Reduce全部内容,希望文章能够帮你解决MongoDB Map Reduce所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。