亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【mongoDB高級(jí)篇③】綜合實(shí)戰(zhàn)(1): 分析國(guó)家地震數(shù)據(jù)

Olivia / 778人閱讀

摘要:數(shù)據(jù)準(zhǔn)備下載國(guó)家地震數(shù)據(jù)通過(guò)導(dǎo)入到數(shù)據(jù)庫(kù)方便和語(yǔ)句做對(duì)比分片集群配置創(chuàng)建數(shù)據(jù)目錄創(chuàng)建日志目錄啟動(dòng)實(shí)例啟動(dòng)實(shí)例創(chuàng)建數(shù)據(jù)目錄啟動(dòng)實(shí)例啟動(dòng)實(shí)例此操作需要連接庫(kù)添加或者用命令來(lái)添加下同設(shè)置分片存儲(chǔ)的數(shù)據(jù)庫(kù)設(shè)置分片的集合名稱。

數(shù)據(jù)準(zhǔn)備

下載國(guó)家地震數(shù)據(jù) http://data.earthquake.cn/data/

通過(guò)navicat導(dǎo)入到數(shù)據(jù)庫(kù),方便和mysql語(yǔ)句做對(duì)比

shard分片集群配置
# step 1
mkdir -p ./data/shard/s0 ./data/shard/s1  #創(chuàng)建數(shù)據(jù)目錄
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 # 啟動(dòng)Shard Server實(shí)例1
./bin/mongod --port 27018 --dbpath /usr/local/mongodb/data/shard/s1 --fork --logpath /usr/local/mongodb/data/shard/log/s1.log # 啟動(dòng)Shard Server實(shí)例2

# step 2
mkdir -p ./data/shard/config #創(chuàng)建數(shù)據(jù)目錄
./bin/mongod --port 27027 --dbpath /usr/local/mongodb/data/shard/config --fork --logpath /usr/local/mongodb/data/shard/log/config.log #啟動(dòng)Config Server實(shí)例

# step 3
./bin/mongos --port 4000 --configdb localhost:27027 --fork --logpath /usr/local/mongodb/data/shard/log/route.log --chunkSize=1 # 啟動(dòng)Route Server實(shí)例

# step 4
./bin/mongo admin --port 4000 #此操作需要連接admin庫(kù)
> db.runCommand({ addshard:"localhost:27017" }) #添加 Shard Server 或者用 sh.addshard()命令來(lái)添加,下同;
{ "shardAdded" : "shard0000", "ok" : 1 }
> db.runCommand({ addshard:"localhost:27018" })
{ "shardAdded" : "shard0001", "ok" : 1 }
> db.runCommand({ enablesharding:"map" }) #設(shè)置分片存儲(chǔ)的數(shù)據(jù)庫(kù)
{ "ok" : 1 }
> db.runCommand({ shardcollection: "map.dz", key: { id:1 }}) # 設(shè)置分片的集合名稱。且必須指定Shard Key,系統(tǒng)會(huì)自動(dòng)創(chuàng)建索引,然后根據(jù)這個(gè)shard Key來(lái)計(jì)算
{ "collectionsharded" : "map.dz", "ok" : 1 }

# 手動(dòng)預(yù)先分片
 for(var i=1;i<=30;i++) { sh.splitAt("map.dz",{id:i*1000}) }

然后通過(guò)MongoVUE把mysql中的數(shù)據(jù)導(dǎo)入到mongos(4000)中

數(shù)據(jù)分析實(shí)戰(zhàn) 根據(jù)震級(jí)類型來(lái)求和
/******通過(guò)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不能使用在分片上

/******通過(guò)聚合管道aggregate******/
db.dz.aggregate([
 {
   $group:{
     _id:"$type",
     count:{$sum:1}
   }
 }
 
 /******通過(guò)映射化簡(jiǎn)mapReduce******/
 var map = function(){
  emit(this.type,1); //把1映射到每個(gè)this.type上,然后sum就為count,還有一個(gè)技巧就是把count映射到1上,就是求總和
}

var reduce = function(type,count){
  var total = Array.sum(count);
  // return {type:type,count:total}; 注意,這樣返回是錯(cuò)誤的,total是一個(gè)對(duì)象??? {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"});
根據(jù)日期來(lái)分組看哪一月的地震最多
/*****地震每日發(fā)生次數(shù)最多的地方*****/
db.dz.aggregate([
  { $group:{
    _id:{date:"$date"}, //還不知道如何通過(guò) date.substring(0,6)來(lái)分組,先跳過(guò),做按日來(lái)分組,當(dāng)然這里的date還是字符串,如果是日期類型的話,就好處理了,這就延伸出另外一個(gè)問(wèn)題,字符串如何轉(zhuǎn)換為時(shí)間類型;
    count:{$sum:1},
    }
  },
  {
    $sort:{count:-1} // 做了個(gè)降序
  },
  {
    $limit:1
  }
]);

/*****每日發(fā)生地震次數(shù)最多的10個(gè)地方,并求出最大值*****/
db.dz.aggregate([
  { $group:{
    _id:{date:"$date",address:"$address"}, 
    count:{$sum:1},
    maxvalue:{$max:"$value"},
    }
  },
  {
    $sort:{count:-1}
  },
  {
    $limit:10
  }
]);
求每5個(gè)經(jīng)緯度范圍的地震次數(shù);
var map = function(){
  //映射到經(jīng)緯度
  var latitude = Math.floor(this.latitude/5)*5;
  var longitude = Math.floor(this.longitude/5)*5; //除5下取整又乘以5,目的得到的經(jīng)緯度都是5的倍數(shù),也就是每隔5就一個(gè)數(shù);
  var block = latitude+":"+longitude;
  emit(block,1); //總共統(tǒng)計(jì)每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個(gè)地方,并求出震級(jí)最大值 方法一,該方法有誤,未完成,先記錄

注意,本方法有一些問(wèn)題我是花了很多功夫都沒(méi)解決,先記錄一下,如果有玩mongoDB的朋友有緣看到這篇文章,又有心的話,希望留言指正;
當(dāng)然,這屬于技術(shù)上的一個(gè)鉆牛角尖,其實(shí)完全可以繞開(kāi)的...

var map = function(){
  var date = this.date.substring(0,6);
  emit(date,{count:this.address,value:this.value});//把地點(diǎn)和值映射到月份上
}


var reduce = function(date,result){ 

/*
  // 此時(shí)result的結(jié)構(gòu)應(yīng)該如下,為每月的地址數(shù)據(jù)明細(xì)
  // 注意這里說(shuō)的是應(yīng)該,但實(shí)際上不是,這與我理解的mapReduce有誤,并且我暫時(shí)還不能理解該結(jié)構(gòu)最終為什么會(huì)呈現(xiàn)出差異,所以,我先按以下的結(jié)構(gòu),來(lái)在Reduce中做js處理
    "result": [
        {
            "address": "新疆阿圖什",
            "value": 1.6
        },
        {
            "address": "云南瀾滄",
            "value": 1.3
        },
        {
            "address": "新疆哈密",
            "value": 2
        }
    ]

  //我想要得到的結(jié)果如下:
  [{"四川木里":{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 
方法二

本方法也有一個(gè)讓我百思不得其解的問(wèn)題,在注釋部分有說(shuō)明;

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

mongoDB系列文章到此先告一段落,后續(xù)再添加 【mongoDB高級(jí)篇】mongoDB在LBS中的應(yīng)用; 2015-9-17

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/18821.html

相關(guān)文章

  • ?? 程序員【代碼管理】工具介紹??,熱門語(yǔ)言更新這么快,你繞不過(guò)這一關(guān)的!

    上次講了2個(gè)游戲源碼 前端實(shí)戰(zhàn)之js推箱子游戲(有界面、附源碼、贊關(guān)藏) Python實(shí)戰(zhàn):五子棋小游戲,切身感受一下前端和桌面應(yīng)用的區(qū)別,選擇自己喜歡的 本來(lái)今天準(zhǔn)備寫一篇面向?qū)ο笪恼?,但是想一想,講面向?qū)ο笾斑€是先給大家介紹幾款實(shí)用的工具,更加快速的理解,掌握知識(shí)點(diǎn)。 1.UML 統(tǒng)一建模語(yǔ)言(Unified Modeling Language,UML)是一種為面向?qū)ο笙到y(tǒng)的產(chǎn)品進(jìn)行說(shuō)明、可...

    array_huang 評(píng)論0 收藏0
  • 類的加載機(jī)制 - 收藏集 - 掘金

    摘要:是現(xiàn)在廣泛流行的代從開(kāi)始學(xué)習(xí)系列之向提交代碼掘金讀完本文大概需要分鐘。為了進(jìn)行高效的垃圾回收,虛擬機(jī)把堆內(nèi)存劃分成新生代老年代和永久代中無(wú)永久代,使用實(shí)現(xiàn)三塊區(qū)域。 React Native 開(kāi)源項(xiàng)目 - 仿美團(tuán)客戶端 (Android、iOS 雙適配) - Android - 掘金推薦 React Native 學(xué)習(xí)好項(xiàng)目,仿照美團(tuán)客戶端... 極簡(jiǎn) GitHub 上手教程 - 工具...

    Gilbertat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Olivia

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<