数据准备

通过navicat导入到数据库,方便和mysql语句做对比

shard分片集群配置

# step 1

mkdir -p ./data/shard/s0 ./data/shard/s1 #创建数据目录

mkdir -p ./data/shard/log # 创建日志目录

./bin/mongod --port 27017 --dbpath /usr/local/mongodb/data/shard/s0 --fork --logpath /usr/local/mongodb/data/shard/log/s0.log # 启动Shard Server实例1

./bin/mongod --port 27018 --dbpath /usr/local/mongodb/data/shard/s1 --fork --logpath /usr/local/mongodb/data/shard/log/s1.log # 启动Shard Server实例2

# step 2

mkdir -p ./data/shard/config #创建数据目录

./bin/mongod --port 27027 --dbpath /usr/local/mongodb/data/shard/config --fork --logpath /usr/local/mongodb/data/shard/log/config.log #启动Config Server实例

# step 3

./bin/mongos --port 4000 --configdb localhost:27027 --fork --logpath /usr/local/mongodb/data/shard/log/route.log --chunkSize=1 # 启动Route Server实例

# step 4

./bin/mongo admin --port 4000 #此操作需要连接admin库

> db.runCommand({ addshard:"localhost:27017" }) #添加 Shard Server 或者用 sh.addshard()命令来添加,下同;

{ "shardAdded" : "shard0000", "ok" : 1 }

> db.runCommand({ addshard:"localhost:27018" })

{ "shardAdded" : "shard0001", "ok" : 1 }

> db.runCommand({ enablesharding:"map" }) #设置分片存储的数据库

{ "ok" : 1 }

> db.runCommand({ shardcollection: "map.dz", key: { id:1 }}) # 设置分片的集合名称。且必须指定Shard Key,系统会自动创建索引,然后根据这个shard Key来计算

{ "collectionsharded" : "map.dz", "ok" : 1 }

# 手动预先分片

for(var i=1;i<=30;i++) { sh.splitAt('map.dz',{id:i*1000}) }

然后通过MongoVUE把mysql中的数据导入到mongos(4000)中

数据分析实战

根据震级类型来求和

/******通过group******/

db.dz.group({

key:{type:1},

initial:{count:0},

reduce: function ( curr, result ) {

result.count ++;

}

})

// Error: group command failed: { "ok" : 0, "errmsg" : "can't do command: group on sharded collection" }

// group不能使用在分片上

/******通过聚合管道aggregate******/

db.dz.aggregate([

{

$group:{

_id:"$type",

count:{$sum:1}

}

}

/******通过映射化简mapReduce******/

var map = function(){

emit(this.type,1); //把1映射到每个this.type上,然后sum就为count,还有一个技巧就是把count映射到1上,就是求总和

}

var reduce = function(type,count){

var total = Array.sum(count);

// return {type:type,count:total}; 注意,这样返回是错误的,total是一个对象??? {type:type,count:count};

return total;

}

//或者

var reduce = function(type,count){

var res = 0;

for (var i = 0; i < count.length;i++) {

res +=count[i];

}

return res;

}

db.dz.mapReduce(map,reduce,{out:'res'});

根据日期来分组看哪一月的地震最多

/*****地震每日发生次数最多的地方*****/

db.dz.aggregate([

{ $group:{

_id:{date:"$date"}, //还不知道如何通过 date.substring(0,6)来分组,先跳过,做按日来分组,当然这里的date还是字符串,如果是日期类型的话,就好处理了,这就延伸出另外一个问题,字符串如何转换为时间类型;

count:{$sum:1},

}

},

{

$sort:{count:-1} // 做了个降序

},

{

$limit:1

}

]);

/*****每日发生地震次数最多的10个地方,并求出最大值*****/

db.dz.aggregate([

{ $group:{

_id:{date:"$date",address:"$address"},

count:{$sum:1},

maxvalue:{$max:"$value"},

}

},

{

$sort:{count:-1}

},

{

$limit:10

}

]);

求每5个经纬度范围的地震次数;

var map = function(){

//映射到经纬度

var latitude = Math.floor(this.latitude/5)*5;

var longitude = Math.floor(this.longitude/5)*5; //除5下取整又乘以5,目的得到的经纬度都是5的倍数,也就是每隔5就一个数;

var block = latitude+':'+longitude;

emit(block,1); //总共统计每block出现地震的次数;

}

var reduce = function(block,value){

return Array.sum(value);

}

db.runCommand({

mapReduce:'dz',

map:map,

reduce:reduce,

out:'res'

})

db.res.find().sort({value:-1});

每月发生地震次数最多的10个地方,并求出震级最大值

方法一,该方法有误,未完成,先记录

注意,本方法有一些问题我是花了很多功夫都没解决,先记录一下,如果有玩mongoDB的朋友有缘看到这篇文章,又有心的话,希望留言指正;

当然,这属于技术上的一个钻牛角尖,其实完全可以绕开的...

var map = function(){

var date = this.date.substring(0,6);

emit(date,{count:this.address,value:this.value});//把地点和值映射到月份上

}

var reduce = function(date,result){

/*

// 此时result的结构应该如下,为每月的地址数据明细

// 注意这里说的是应该,但实际上不是,这与我理解的mapReduce有误,并且我暂时还不能理解该结构最终为什么会呈现出差异,所以,我先按以下的结构,来在Reduce中做js处理

"result": [

{

"address": "新疆阿图什",

"value": 1.6

},

{

"address": "云南澜沧",

"value": 1.3

},

{

"address": "新疆哈密",

"value": 2

}

]

//我想要得到的结果如下:

[{'四川木里':{count:2,max:5.2},'云南玉龙':{count:100,max:4.5}}]

*/

var arr = [];

for (var i = 0; i < result.length;i++) {

var arrTmp = [result[i]];

var address = result[i]['address'];

for (var j = i+1; j < result.length; j++) {

if(result[j]['address'] == address){

arrTmp.push(result[j]);

result.splice(j,1);

j--;

}

};

var value = []

for(var a=0; a

if(value.indexOf(arrTmp[a]['value']) == '-1'){

value.push(arrTmp[a]['value']);

}

}

var max = 0;

for(var i=0;i

max = max < value[i]?value[i]:max;

}

var ele = {};

ele[address] = {count:arrTmp.length,max:max};

arr.push(ele);

}

return {result:arr};

}

db.runCommand({

mapReduce:'dz',

map:map,

reduce:reduce,

finalize:finalize, // 由于Reduce返回的结构是有误的,所以finalize还没办法处理,先留空;

out:'res'

})

方法二

本方法也有一个让我百思不得其解的问题,在注释部分有说明;

var map = function(){

var date = this.date.substring(0,6);

var map = date+'_'+this.address;

emit(map,{count:1,value:this.value});

}

var reduce = function(date,result){

var count = 0;

for(var i=0;i

count += result[i]['count']; // result[i]['count']的值都是1

}

//var count = result.length; // 一开始我的count值是这样写的,但是结果是错误的与mysql算出来的不符合,改成上面的才正确,这里也让我很郁闷,result[i]['count']的值都是1,result.length是其result元素的总合,按道理这个count和上面的count是一样的,但事实证明,我又错了,居然不一样....又是一个理解不了的问题;

var value = [];

for(var i=0;i

value.push(result[i].value);

}

var max=0;

for(var i=0;i

max = max < value[i]?value[i]:max;

}

return {count:count,max:max};

}

db.runCommand({

mapReduce:'dz',

map:map,

reduce:reduce,

out:'res'

})

db.res.find().sort({'value.count':-1}).limit(10); //在输出集合中再进行筛选

// 但是,第一多的数据和mysql算下来的不同,其后9名都是相同的

mongoDB系列文章到此先告一段落,后续再添加 【mongoDB高级篇】mongoDB在LBS中的应用; 2015-9-17

mangodb 高频数据_【mongoDB高级篇③】综合实战(1): 分析国家地震数据相关推荐

  1. 12面魔方公式图解法_【高级篇】(三)三阶魔方CFOP高级玩法之——F2L

    一.F2L这一步要干什么 1.先了解一下"棱角对"和"槽位"的概念 棱角对:即由一个棱块和一个角块构成,是F2L的基本单元(共四组) 槽位:给"棱角对 ...

  2. 魔方cfop公式软件_【高级篇】(三)三阶魔方CFOP高级玩法之——F2L

    一.F2L这一步要干什么 1.先了解一下"棱角对"和"槽位"的概念 棱角对:即由一个棱块和一个角块构成,是F2L的基本单元(共四组) 槽位:给"棱角对 ...

  3. 魔方cfop公式软件_【高级篇】(四)三阶魔方CFOP高级玩法之——OLL

    一.OLL这一步需要做什么? OLL这一步是最容易理解的,到了这一步,前两层已经全部复原了 那不管顶面出现什么情况,都能用一个公式将顶面黄色朝向全部调整正确(顺序不管) 一步到位的代价就是--这步骤有 ...

  4. sql 获取两个月内数据_如何在3个月的时间内自学成为数据分析师?

    从一名0基础的用户运营自学成为数据分析师,我花了大半年的时间,但是抛开工作时间,系统性的学习只花了3个月. 这篇文章会从学习资源和学习路径两个方面分享我的自学经验,希望能对大家有所帮助. 先来说说有哪 ...

  5. datetime插入数据_量化学习:聚宽jqdatasdk对接vnpy的数据服务

    -- 本篇文章 by 丁智 数据服务:使用聚宽jqdatasdk获取分钟数据按vnpy的Bar格式导入至mongodb中 提供downloadAllMinuteBar(),可以通过定时任务的形式,按v ...

  6. xlsx表格怎么筛选重复数据_在Excel中怎样筛选以及删除重复的数据呢?

    Excel中大量的公式函数可以应用选择,分析信息并管理电子表格或网页中的数据信息列表与数据资料图表制作,可以实现许多方便的功能,带给使用者方便.今天就跟着小编一起来看一看:在Excel中怎样筛选以及删 ...

  7. 怎么提取pdf中的表格数据_如何从pdf第1部分中提取表格数据

    怎么提取pdf中的表格数据 In this article, we talk about the challenges and principles of extracting tabular dat ...

  8. pythonrequests发送数据_在python中使用requests 模拟浏览器发送请求数据的方法

    在python中使用requests 模拟浏览器发送请求数据的方法 如下所示: import requests url='http://####' proxy={'http':'http://#### ...

  9. vue调用接口获取后台数据_使用Vue实现调用接口加载页面初始数据

    使用Vue实现调用接口加载页面初始数据 闲着没事写了一个电影推荐的网页,很简单,使用的是Vue的实现. let vm = new Vue({ el:'#content', data:{ name:'' ...

最新文章

  1. Spring常用工具类
  2. 如何替换字符串中出现的所有字符?
  3. Docker Swarm服务发现和负载均衡原理
  4. 吕布流水账 -- 纪念我的爱情
  5. 二十年后我发明了保姆机器人作文_我想发明保姆机器人作文700字
  6. 实践操作--云端深度学习工作站配置指南(转)
  7. html css animation,css animation是什么?
  8. 1.3 编程基础之算术表达式与顺序执行 10 计算并联电阻的阻值
  9. HRBUST 1473 教主的遗产【状态压缩】
  10. 基于sigmoid的文本多标签分类模型代码实现
  11. Flume篇---Flume安装配置与相关使用
  12. Linux操作环境下配置MMIX环境
  13. hadoop、spark、flink集群修改默认ssh端口号
  14. 数据:FIT2CLOUD飞致云连续进入云管理软件市场权威研究报告
  15. C语言中结构体所占内存空间
  16. 搜集70个国外搜索引擎网站,供大家学习参考
  17. ubuntu ibus-中文输入法
  18. app:processDebugManifest 错误
  19. matlab让legend横着排,echarts画一个饼图, orient: 'horizontal',图例横向排列,当图例比较多时,如何在第二排让图标一一对齐?...
  20. 一文带你了解-Java集合超详解(破天荒总结)

热门文章

  1. php 数组交集函数,php数组交集函数
  2. VMWare网络适配器解释及设置(NAT、桥接、仅主机)
  3. python+unittest框架 UI自动化设计思路以及代码剖析,增加易用性
  4. 程序员是否需要具备抽象思维?
  5. matlab数值逼近,Matlab与数值分析函数的数值逼近作业
  6. Android系统多任务双屏异显
  7. Java实现视频在线播放flv视频
  8. Number of Under-Replicated Blocks长期大于0问题解决
  9. java hybris_学习hybris java需要哪些基础
  10. 在编译时出现无法解析的外部符号Cxx::AssertValid(void)const的解决方法