[HADOOP] mongodb-mapReduce 출력을 그룹화하는 방법은 무엇입니까?
HADOOPmongodb-mapReduce 출력을 그룹화하는 방법은 무엇입니까?
mapReduce mongodb 프레임 워크에 관한 쿼리가 있으므로 mapReduce 함수의 키 값 쌍 결과를 얻었으므로 mapReduce 출력에 대한 쿼리를 실행하려고합니다.
그래서 mapReduce를 사용하여이 같은 사용자 통계를 찾습니다.
db.order.mapReduce(function() { emit (this.customer,{count:1,orderDate:this.orderDate.interval_start}) },
function(key,values){
var sum =0 ; var lastOrderDate;
values.forEach(function(value) {
if(value['orderDate']){
lastOrderDate=value['orderDate'];
}
sum+=value['count'];
});
return {count:sum,lastOrderDate:lastOrderDate};
},
{ query:{status:"DELIVERED"},out:"order_total"}).find()
이걸 내게주는 출력
{ "_id" : ObjectId("5443765ae4b05294c8944d5b"), "value" : { "count" : 1, "orderDate" : ISODate("2014-10-18T18:30:00Z") } }
{ "_id" : ObjectId("54561911e4b07a0a501276af"), "value" : { "count" : 2, "lastOrderDate" : ISODate("2015-03-14T18:30:00Z") } }
{ "_id" : ObjectId("54561b9ce4b07a0a501276b1"), "value" : { "count" : 1, "orderDate" : ISODate("2014-11-01T18:30:00Z") } }
{ "_id" : ObjectId("5458712ee4b07a0a501276c2"), "value" : { "count" : 2, "lastOrderDate" : ISODate("2014-11-03T18:30:00Z") } }
{ "_id" : ObjectId("545f64e7e4b07a0a501276db"), "value" : { "count" : 15, "lastOrderDate" : ISODate("2015-06-04T18:30:00Z") } }
{ "_id" : ObjectId("54690771e4b0070527c657ed"), "value" : { "count" : 6, "lastOrderDate" : ISODate("2015-06-03T18:30:00Z") } }
{ "_id" : ObjectId("54696c64e4b07f3c07010b4a"), "value" : { "count" : 1, "orderDate" : ISODate("2014-11-18T18:30:00Z") } }
{ "_id" : ObjectId("546980d1e4b07f3c07010b4d"), "value" : { "count" : 4, "lastOrderDate" : ISODate("2015-03-24T18:30:00Z") } }
{ "_id" : ObjectId("54699ac4e4b07f3c07010b51"), "value" : { "count" : 30, "lastOrderDate" : ISODate("2015-05-23T18:30:00Z") } }
{ "_id" : ObjectId("54699d0be4b07f3c07010b55"), "value" : { "count" : 1, "orderDate" : ISODate("2014-11-16T18:30:00Z") } }
{ "_id" : ObjectId("5469a1dce4b07f3c07010b59"), "value" : { "count" : 2, "lastOrderDate" : ISODate("2015-04-29T18:30:00Z") } }
{ "_id" : ObjectId("5469a96ce4b07f3c07010b5e"), "value" : { "count" : 1, "orderDate" : ISODate("2014-11-16T18:30:00Z") } }
{ "_id" : ObjectId("5469c1ece4b07f3c07010b64"), "value" : { "count" : 9, "lastOrderDate" : ISODate("2015-04-15T18:30:00Z") } }
{ "_id" : ObjectId("5469f422e4b0ce7d5ee021ad"), "value" : { "count" : 5, "lastOrderDate" : ISODate("2015-06-01T18:30:00Z") } }
......
이제 쿼리를 실행하고 한 그룹에서 5 이하, 다른 그룹에서 5-10과 같이 다른 카테고리의 사용자 수를 기준으로 사용자를 그룹화하려고합니다.
다음과 같이 출력하고 싶습니다.
{userLessThan5: 9 }
{user5to10: 2 }
{user10to15: 1 }
{user15to20: 0 }
....
해결법
-
==============================
1.이 시도,
이 시도,
db.order.mapReduce(function() { emit (this.customer,{count:1,orderDate:this.orderDate.interval_start}) }, function(key,values){ var category; // add this new field var sum =0 ; var lastOrderDate; values.forEach(function(value) { if(value['orderDate']){ lastOrderDate=value['orderDate']; } sum+=value['count']; }); // at this point you are already aware in which category your records lies , just add a new field to mark it if(sum < 5){ category: userLessThan5}; if(sum >= 5 && sum <=10){ category: user5to10}; if(sum <= 10 && sum >= 15){ category: user10to15}; if(sum <= 15 && sum >=20){ category: user15to20}; .... return {count:sum,lastOrderDate:lastOrderDate,category:category}; }, { query:{status:"DELIVERED"},out:"order_total"}).find() db.order_total.aggregate([{ $group: { "_id": "$value.category", "users": { $sum: 1 } } }]);
당신은 원하는 결과를 얻을 것이다
{userLessThan5: 9 } {user5to10: 2 } {user10to15: 1 } {user15to20: 0 } ....
-
==============================
2.내 지식에 따라 집계 데이터를 사용하여 쿼리를 작성,이 문제를 해결하는 더 좋은 방법이있을 수 있습니다.
내 지식에 따라 집계 데이터를 사용하여 쿼리를 작성,이 문제를 해결하는 더 좋은 방법이있을 수 있습니다.
var a=db.test.aggregate([{$match:{"value.count":{$lt:5}}}, { $group: { _id:"$value.count",total:{"$sum":1}}}, {$group:{_id:"less than 5",total:{$sum:"$total"}}}]) var b=db.test.aggregate([{$match:{"value.count":{$lt:10,$gt:5}}}, { $group: { _id:"$value.count",total:{"$sum":1}}}, {$group:{_id:"between 5 and 10",total:{$sum:"$total"}}}]) var c=db.test.aggregate([{$match:{"value.count":{$lt:15,$gt:10}}}, { $group: { _id:"$value.count",total:{"$sum":1}}}, {$group:{_id:"between 10 and 15",total:{$sum:"$total"}}}])
a, b, c를 다른 컬렉션에 삽입하십시오.
-
==============================
3.mapreduce 후 출력 데이터를 아래의 집계를 통해 매 5 간격 카운트로 그룹화 할 수 있습니다.
mapreduce 후 출력 데이터를 아래의 집계를 통해 매 5 간격 카운트로 그룹화 할 수 있습니다.
db.data.aggregate([ { "$group": { "_id": { "$subtract": [ { "$subtract": [ "$value.count", 0 ] }, { "$mod": [ { "$subtract": [ "$value.count", 0 ] }, 5 ]} ] }, "count": { "$sum": 1 } }} ])
여기에 관련 질문 하나가있을 수도 있습니다.
from https://stackoverflow.com/questions/35426213/how-to-group-mongodb-mapreduce-output by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop 파일 쓰기 (0) | 2019.06.05 |
---|---|
[HADOOP] 하이브에서 OutOfMemoryError를 피하는보다 효율적인 쿼리 (0) | 2019.06.05 |
[HADOOP] Hadoop 2.0 JAR 파일 (0) | 2019.06.05 |
[HADOOP] 돼지 라틴어 때마다 다른 구분 기호로 파일을로드하는 방법 (0) | 2019.06.05 |
[HADOOP] Hadoop Pseudo-Distributed Operation 오류 : 프로토콜 메시지 태그의 와이어 유형이 잘못되었습니다. (0) | 2019.06.05 |