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








### Map-Reduce概念 Map-Reduce是一种编程模型,主要用于大规模数据集(大于1TB)的并行运算。该模型简化了分布式计算程序的设计开发过程,允许开发者专注于业务逻辑而无需关心底层复杂的分布式细节。 #### 工作流程概述 整个工作流分为两个主要阶段:Map阶段Reduce阶段。在Map阶段,输入的数据被分割成多个分片,每个分片由一个Mapper函数独立处理;而在Reduce阶段,则是对来自不同Mapper的结果进行汇总整理[^4]。 ```javascript db.yourCollection.mapReduce( function() { emit(this.key, this.value); }, function(key, values) { return Array.sum(values); }, { out: "outputCollection" } ); ``` 这段代码展示了如何利用MongoDB内置的支持来执行一次简Map-Reduce操作。这里定义了一个匿名`mapFunction`用于发射键值对,以及一个`reduceFunction`用来累加相同key对应的value列表,并指定了输出集合名为`outputCollection`[^1]。 #### 实现机制 当启动一个Map-Reduce作业时: - **任务调度**:系统会自动将待处理的大规模数据切分成若干个小块,分配给集群中的多台机器并发执行。 - **中间结果传输**:完成映射后的临时文件会被存储于本地磁盘或HDFS之上,在此之后这些文件将会被复制到Reducer所在节点上供其读取使用[^5]。 - **资源管理**:为了保证性能最优,默认设置下每一个Map/Reduce子进程都会获得一定量级的内存空间(通常是1GB),同时也只会占用个处理器核心来进行计算。不过实际应用当中可以根据需求调整相应的资源配置参数如`mapreduce.map.memory.mb`, `mapreduce.reduce.memory.mb`等[^2]。 #### 应用场景举例 通过上述介绍可以看出,Map-Reduce非常适合应用于那些涉及海量记录的日志分析领域内——比如统计网站访问者的行为特征、追踪网络流量趋势变化等等。它能够帮助我们快速有效地挖掘隐藏在庞杂无序信息背后的价值规律。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值