摘要:數(shù)據準備下載國家地震數(shù)據通過導入到數(shù)據庫方便和語句做對比分片集群配置創(chuàng)建數(shù)據目錄創(chuàng)建日志目錄啟動實例啟動實例創(chuàng)建數(shù)據目錄啟動實例啟動實例此操作需要連接庫添加或者用命令來添加下同設置分片存儲的數(shù)據庫設置分片的集合名稱。
數(shù)據準備
下載國家地震數(shù)據 http://data.earthquake.cn/data/
通過navicat導入到數(shù)據庫,方便和mysql語句做對比
shard分片集群配置# step 1 mkdir -p ./data/shard/s0 ./data/shard/s1 #創(chuàng)建數(shù)據目錄 mkdir -p ./data/shard/log # 創(chuàng)建日志目錄 ./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 #創(chuàng)建數(shù)據目錄 ./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" }) #設置分片存儲的數(shù)據庫 { "ok" : 1 } > db.runCommand({ shardcollection: "map.dz", key: { id:1 }}) # 設置分片的集合名稱。且必須指定Shard Key,系統(tǒng)會自動創(chuàng)建索引,然后根據這個shard Key來計算 { "collectionsharded" : "map.dz", "ok" : 1 } # 手動預先分片 for(var i=1;i<=30;i++) { sh.splitAt("map.dz",{id:i*1000}) }
數(shù)據分析實戰(zhàn) 根據震級類型來求和然后通過MongoVUE把mysql中的數(shù)據導入到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"});根據日期來分組看哪一月的地震最多
/*****地震每日發(fā)生次數(shù)最多的地方*****/ db.dz.aggregate([ { $group:{ _id:{date:"$date"}, //還不知道如何通過 date.substring(0,6)來分組,先跳過,做按日來分組,當然這里的date還是字符串,如果是日期類型的話,就好處理了,這就延伸出另外一個問題,字符串如何轉換為時間類型; count:{$sum:1}, } }, { $sort:{count:-1} // 做了個降序 }, { $limit:1 } ]); /*****每日發(fā)生地震次數(shù)最多的10個地方,并求出最大值*****/ db.dz.aggregate([ { $group:{ _id:{date:"$date",address:"$address"}, count:{$sum:1}, maxvalue:{$max:"$value"}, } }, { $sort:{count:-1} }, { $limit:10 } ]);求每5個經緯度范圍的地震次數(shù);
var map = function(){ //映射到經緯度 var latitude = Math.floor(this.latitude/5)*5; var longitude = Math.floor(this.longitude/5)*5; //除5下取整又乘以5,目的得到的經緯度都是5的倍數(shù),也就是每隔5就一個數(shù); var block = latitude+":"+longitude; emit(block,1); //總共統(tǒng)計每block出現(xiàn)地震的次數(shù); } 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});每月發(fā)生地震次數(shù)最多的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的結構應該如下,為每月的地址數(shù)據明細 // 注意這里說的是應該,但實際上不是,這與我理解的mapReduce有誤,并且我暫時還不能理解該結構最終為什么會呈現(xiàn)出差異,所以,我先按以下的結構,來在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方法二 本方法也有一個讓我百思不得其解的問題,在注釋部分有說明;
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;imongoDB系列文章到此先告一段落,后續(xù)再添加 【mongoDB高級篇】mongoDB在LBS中的應用; 2015-9-17
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/18821.html
上次講了2個游戲源碼 前端實戰(zhàn)之js推箱子游戲(有界面、附源碼、贊關藏) Python實戰(zhàn):五子棋小游戲,切身感受一下前端和桌面應用的區(qū)別,選擇自己喜歡的 本來今天準備寫一篇面向對象文章,但是想一想,講面向對象之前還是先給大家介紹幾款實用的工具,更加快速的理解,掌握知識點。 1.UML 統(tǒng)一建模語言(Unified Modeling Language,UML)是一種為面向對象系統(tǒng)的產品進行說明、可...
摘要:是現(xiàn)在廣泛流行的代從開始學習系列之向提交代碼掘金讀完本文大概需要分鐘。為了進行高效的垃圾回收,虛擬機把堆內存劃分成新生代老年代和永久代中無永久代,使用實現(xiàn)三塊區(qū)域。 React Native 開源項目 - 仿美團客戶端 (Android、iOS 雙適配) - Android - 掘金推薦 React Native 學習好項目,仿照美團客戶端... 極簡 GitHub 上手教程 - 工具...
閱讀 2039·2023-04-26 00:16
閱讀 3487·2021-11-15 11:38
閱讀 3181·2019-08-30 12:50
閱讀 3191·2019-08-29 13:59
閱讀 762·2019-08-29 13:54
閱讀 2512·2019-08-29 13:42
閱讀 3315·2019-08-26 11:45
閱讀 2196·2019-08-26 11:36