java-mongodb-mapreduce多集合、单集合的、多个map-key、多个map-value

本文提供了一个实用的 Java 工具类,用于 MongoDB 中的 MapReduce 操作,支持多集合、单集合汇总,同时处理多个 map-key 和 map-value 的场景。该工具通过灵活配置参数实现不同类型的统计需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MapReduceCommand;
import com.mongodb.MapReduceOutput;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
/**
* mongodb的mapreduce的多集合。单集合汇总工具类
* @author lichao
*
*/
public class MapReduceMergeTools {


private Mongo mongo = null;
private DB db = null;


public void init() {
try {
mongo = new Mongo("10.10.24.200");
db = mongo.getDB("test");
} catch (UnknownHostException e) {
e.printStackTrace(); 
} catch (MongoException e) {
e.printStackTrace();
}
}


/**
* 单表汇总的mapreduce
* @param mergeCollectionName:需要汇总的集合名称
* @param keyName:进行计算的key值(可以包含多个key,汇总条件)
* @param valueName:根据key进汇总的的value值(返回多个value,汇总的值)
* @param targetCollectioName
*/
public void singleTableMapReduce(String mergeCollectionName,String keyName[],String valueName[],String targetCollectioName) {
//编写mapreduce的map函数
StringBuffer mapbuf = new StringBuffer();
mapbuf.append("function() { \n");
mapbuf.append("emit( \n");
mapbuf.append("{");
if(keyName!=null&&valueName!=null){
//组合map的值
for(int i = 0;i<keyName.length;i++){
mapbuf.append(+i+":this."+keyName[i]);
if(i<keyName.length-1){
mapbuf.append(",");
}else{
mapbuf.append("},\n");
}
}
mapbuf.append("{");
//组合value的值
for(int j = 0;j<valueName.length;j++){
mapbuf.append(valueName[j]+":this."+valueName[j]);
if(j<valueName.length-1){
mapbuf.append(","); 
}else{
mapbuf.append("}\n");
}
}
}
mapbuf.append(" )\n");
mapbuf.append("}");


//编写mapreduce的reduce函数
StringBuffer reduceBuf = new StringBuffer();
reduceBuf.append("function Reduce(key, values) { \n");
if(keyName!=null&&valueName!=null){
for(int j = 0;j<valueName.length;j++){
reduceBuf.append(" var "+valueName[j]+"= 0; \n");
}
}
reduceBuf.append(" values.forEach(function(val) { \n");
if(keyName!=null&&valueName!=null){
for(int j = 0;j<valueName.length;j++){
reduceBuf.append(" "+valueName[j]+"+=val."+valueName[j]+";\n");
}
}
reduceBuf.append("})\n");
reduceBuf.append("return{");
if(keyName!=null&&valueName!=null){
for(int j = 0;j<valueName.length;j++){
reduceBuf.append(valueName[j]+":"+valueName[j]);
if(j<valueName.length-1){
reduceBuf.append(",");
}else{
reduceBuf.append("}\n");
}
}
}
reduceBuf.append("}");
System.out.println(mapbuf.toString());
DBCollection collection = db.getCollection(mergeCollectionName);
collection.mapReduce(mapbuf.toString(),reduceBuf.toString(),targetCollectioName, null); 
}


/**
* 
* @param mergeCollectionName需要汇总的表数组
* @param keyName 需要进行map的key
* @param valueName 需要根据map的key进行汇总的value
* @param targetCollectioName 需要保存的目标集合
*/
public void mulTableMapReduce(String mergeCollectionName[],String keyName[],String valueName[],String targetCollectioName) {
//编写mapreduce的map函数
StringBuffer mapbuf = new StringBuffer();
mapbuf.append("function() { \n");
mapbuf.append("emit( \n");
mapbuf.append("{");
if(keyName!=null&&valueName!=null){
//组合map的值
for(int i = 0;i<keyName.length;i++){
mapbuf.append(+i+":this."+keyName[i]);
if(i<keyName.length-1){
mapbuf.append(",");
}else{
mapbuf.append("},\n");
}
}
mapbuf.append("{");
//组合value的值
for(int j = 0;j<valueName.length;j++){
mapbuf.append(valueName[j]+":this."+valueName[j]);
if(j<valueName.length-1){
mapbuf.append(","); 
}else{
mapbuf.append("}\n");
}
}
}
mapbuf.append(" )\n");
mapbuf.append("}");


//编写mapreduce的reduce函数
StringBuffer reduceBuf = new StringBuffer();
reduceBuf.append("function Reduce(key, values) { \n");
if(keyName!=null&&valueName!=null){
for(int j = 0;j<valueName.length;j++){
reduceBuf.append(" var "+valueName[j]+"= 0; \n");
}
}
reduceBuf.append(" values.forEach(function(val) { \n");
if(keyName!=null&&valueName!=null){
for(int j = 0;j<valueName.length;j++){
reduceBuf.append(" "+valueName[j]+"+=val."+valueName[j]+";\n");
}
}
reduceBuf.append("})\n");
reduceBuf.append("return{");
if(keyName!=null&&valueName!=null){
for(int j = 0;j<valueName.length;j++){
reduceBuf.append(valueName[j]+":"+valueName[j]);
if(j<valueName.length-1){
reduceBuf.append(",");
}else{
reduceBuf.append("}\n");
}
}
}
reduceBuf.append("}");

for(int t=0;t<mergeCollectionName.length;t++){
DBCollection collection = db.getCollection(mergeCollectionName[t]);
MapReduceCommand cmd = new MapReduceCommand(collection, mapbuf.toString(),reduceBuf.toString(), 
targetCollectioName,MapReduceCommand.OutputType.REDUCE, null);
collection.mapReduce(cmd);
}
}



public static void main(String[] args) {
MapReduceMergeTools test = new MapReduceMergeTools();
test.init();
test.singleTableMapReduce("test", new String[]{"visit_url","visit_date"}, new String[]{"visit_count","success_count"}, "single_collection_mapreduce_result");
test.mulTableMapReduce(new String[]{"test1","test2"}, new String[]{"visit_url","visit_date"}, new String[]{"visit_count","success_count"}, "multi_collection_mapreduce_result");


}
}

最近项目使用到了mogodb的mapreduce统计程序,
以下程序,可以统计“mapreduce多集合、单集合的、多个map-key、多个map-value”
java-mongodb-mapreduce多集合、单集合的、多个map-key、多个map-value








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值