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