`
landows
  • 浏览: 18218 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MongoDB 之MapReduce统计关键字频率测试

 
阅读更多
测试环境:windows xp

  Operating System: Windows XP Professional (5.1, Build 2600) Service Pack 3 (2600.xpsp_sp3_gdr.101209-1647)
  Language: Chinese (Regional Setting: Chinese)
  Processor: Pentium(R) Dual-Core  CPU      E5500  @ 2.80GHz (2 CPUs)
  Memory: 3292MB RAM
测试结果:
   1079844 条数据统计出10957个关键字排序取前100条记录,总耗时:308578毫秒  

测试程序:
import java.io.BufferedReader;
import java.io.FileReader;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MapReduceCommand;
import com.mongodb.MapReduceOutput;
import com.mongodb.Mongo;
import com.mongodb.MongoException;

/**
 * 
 */

/**
 *  *
 */
public class Test4MongoDb {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//insertTestKeywordLog();

		calculateSearchKeyword();

	}

	/**
	 * 生成测试数据
	 */
	private static void insertTestKeywordLog() {
		List<String> keyWordList = new ArrayList<String>();
		try {
			BufferedReader reader = new BufferedReader(new FileReader(
					"d:\\pinyin.txt"));
			String line = null;
			Random ran = new Random(System.currentTimeMillis());
			Mongo m;
			int totalRows = 0;
			long start = 0;
			long end = 0;
			m = new Mongo("localhost", 9999);
			DB db = m.getDB("test");
			DBCollection collection = db.getCollection("t_log");
			String month = "02";
			String year = "2010";
			start = System.currentTimeMillis();
			while ((line = reader.readLine()) != null) {

				int insertCount = ran.nextInt(100);
				if (insertCount == 0) {
					insertCount = 1;
				}
				totalRows += insertCount;
				for (int i = 0; i < insertCount; i++) {

					DBObject record = new BasicDBObject();
					record.put("id", System.currentTimeMillis());
					record.put("keyword", line);

					int day = ran.nextInt(28);
					if (day == 0) {
						day = 1;
					}
					record.put("dd", year + "-" + month
							+ (day < 10 ? "-0" + day : "-" + day));
					collection.save(record);

				}
			}

			end = System.currentTimeMillis();
			System.out.println("insert time =" + (end - start) + " row count="
					+ totalRows);

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 统计查询关键字频率
	 */
	private static void calculateSearchKeyword() {
		long start = 0;
		long end = 0;
		Mongo m;
		try {
			m = new Mongo("localhost", 9999);
			DB db = m.getDB("test");
			DBCollection collection = db.getCollection("t_log");

			DBObject newDB = new BasicDBObject();
			newDB.put("max", 100000);

			String collectionName = "t_log_result_"
					+ System.currentTimeMillis();
			DBCollection resultCollection = db.createCollection(collectionName,
					newDB);

			//创建统计数量索引
			DBObject indexObject = new BasicDBObject();
			indexObject.put("hitCount", -1);
			resultCollection.createIndex(indexObject);
			//DBCollection resultCollection = db.getCollection("t_log_result_"+System.currentTimeMillis());
			start = System.currentTimeMillis();

			DBObject dbKey = new BasicDBObject();
			dbKey.put("dd", true);
			//查询符合条件的数据
			DBObject condition = new BasicDBObject();
			condition.put("dd", new BasicDBObject("$gte", "2010-02-01").append(
					"$lte", "2010-02-28"));

			//定义map
			String map = "function() {   key=this.keyword; "
					+ "		emit(key,{'count':1});  " + "}";
			//定义reduce
			String reduce = " function r( key, values ) { " + "	  var count=0;"
					+ "	  for ( var i = 0; i < values.length; i++ ){"
					+ "	      count += values[i].count;" + "	  }"
					+ " return count;} ";
			///Map<String,Object> scope = new HashMap<String,Object>();

			MapReduceCommand mr = new MapReduceCommand(collection, map, reduce,
					null, MapReduceCommand.OutputType.INLINE, condition);

			int resultCount = 0;
			MapReduceOutput out = collection.mapReduce(mr);
			//获取统计结果
			for (DBObject result : out.results()) {
				Double value = null;
				if (result.get("value") != null
						&& result.get("value") instanceof DBObject) {

					DBObject dbObj = (DBObject) result.get("value");
					value = (Double) dbObj.get("count");

				} else {
					value = (Double) result.get("value");
				}
				String found = (String) result.get("_id");
				DBObject keywordObject = new BasicDBObject();
				keywordObject.put("hitCount", value);
				keywordObject.put("keyword", found);
				//记录到统计结果表中
				resultCollection.save(keywordObject);
				resultCount++;

			}
			DBObject query = new BasicDBObject();
			DBObject orderBy = new BasicDBObject();
			orderBy.put("hitCount", -1);
			//取top100
			DBCursor cursor = resultCollection.find().sort(orderBy).limit(100);
			while (cursor.hasNext()) {
				System.out.println(cursor.next());
			}
			end = System.currentTimeMillis();
			System.out.println("total time =" + (end - start)
					+ " total row count=" + resultCount);

		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MongoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


分享到:
评论

相关推荐

    计算机后端-PHP视频教程. mongodb10 MapReduce 统计栏目下的商品.wmv

    计算机后端-PHP视频教程. mongodb10 MapReduce 统计栏目下的商品.wmv

    MongoDB的MapReduce.pdf

    MongoDB的MapReduce是一种在大型数据集上进行并行计算的编程模型,尤其适用于数据分析任务。MapReduce由Google提出,其灵感来源于函数式编程语言中的Map和Reduce概念,旨在简化分布式计算,使得开发者无需深入理解...

    MongoDB中MapReduce的使用方法详解

    MongoDB的MapReduce是一种强大的工具,用于处理和分析大量数据,尤其适合于复杂的数据聚合任务。MapReduce的工作原理是将大规模数据集分解成小块,分别在不同的节点上执行计算,然后将结果合并以得到最终答案。在...

    mongodb-测试数据

    这个“mongodb-测试数据”压缩包显然包含了一些用于测试MongoDB功能的样例数据集,特别是针对增、删、改、查(CRUD)操作的学习和性能测试。 在深入探讨MongoDB的测试数据之前,我们先来了解一下MongoDB的基本概念...

    MongoDB MapReduce分享.ppt

    在 MongoDB 中,MapReduce 功能可以用来进行数据聚合、统计分析以及创建索引等任务。 1. **Map 函数**: - Map 函数由用户自定义,用于遍历输入文档,提取关键信息,并生成中间键值对。例如,你可以用它来统计网站...

    MongoDB中的MapReduce简介

    MapReduce在MongoDB中的应用非常适合于大数据分析、聚合操作和复杂统计。例如,你可以使用MapReduce来计算用户行为的汇总信息,进行分类或聚类分析,或者在大型日志文件中提取有价值的信息。然而,需要注意的是,...

    计算机后端-PHP视频教程. mongodb09 MapReduce 概念.wmv

    计算机后端-PHP视频教程. mongodb08 导出导入.wmv

    mongodb mapreduce 实例

    总结来说,MongoDB的MapReduce功能为我们提供了一种有效处理和分析大规模订单数据的方法,通过自定义的map和reduce函数,可以实现各种复杂的统计需求,这对于理解和优化业务表现非常有价值。在电子商务领域,这样的...

    MongoDB 中聚合统计计算–$SUM表达式

    我们一般通过表达式$sum来计算总和。因为MongoDB的文档有数组字段,所以可以简单的将计算总和...测试集合mycol中的数据如下: { title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user

    MongoDB与Hadoop MapReduce的海量非结构化数据处理方案.pdf

    MongoDB与Hadoop MapReduce的海量非结构化数据处理方案 本文旨在探索基于MongoDB与Hadoop MapReduce的海量非结构化数据处理方案,旨在解决大数据时代下的数据处理难题。该方案通过MongoDB Cluster、MongoDB-...

    MongoDB中MapReduce编程模型使用实例

    MongoDB是一个高性能、开源、无模式的文档导向数据库,由C++编写而成,支持MapReduce编程模型,MapReduce是一种计算模型,用于处理大规模数据集的并行运算。在MongoDB中,MapReduce主要用于执行复杂的数据聚合操作,...

    MongoDB性能测试报告

    MongoDB性能测试报告详细分析了在大数据量环境下,包括GridFS和组合索引在内的性能表现。通过对5亿数据级别的插入与查询进行测试,本报告旨在探讨不同索引配置、数据量、查询方式等因素对性能的影响。 首先,测试在...

Global site tag (gtag.js) - Google Analytics