2014-12-05 70 views
0

這些文件,我將得到每個至少有一百萬行,最大15億。數據是歸一化當我得到它。我需要一種方法將其存儲在一個文件中。在大多數情況下,我不是100%如何將數據傳遞給我。它可能是csv,固定寬度文本文件或tsv或其他。mongodb插入來自其他集合的嵌入式文檔使用地圖的大規模收藏減少

目前,我有一些收藏品,我從一些樣本CSV的進口。

波紋管是我的一小部分數據丟失的代表領域

我beneficaries.csv數據 重複

beneficaries.csv超過600萬條記錄

record # 1 
{"userid":"a9dk4kJkj", 
"gender":"male", 
"dob":20080514, 
"start_date":20000101, 
"end_date":20080227} 

record # 2 
{"userid":"a9dk4kJkj", 
"gender":"male", 
"dob":20080514, 
"start_date":20080201, 
"end_date":00000000} 

same user different start and end dates 

claims.csv

超過200萬條記錄

{"userid":"a9dk4kJkj", 
    "date":20080514, 
    "code":"d4rd3", 
    "blah":"data"} 

lab.csv超過10萬條記錄

{"userid":"a9dk4kJkj", 
    "date":20080514, 
    "lab":"mri", 
    "blah":"data"} 

從我有限的知識,我有三個選項

  1. 對文件進行排序,從數據文件中讀取我們的C++成員對象x量,停在y,將成員插入到mongodb中,繼續前進到y開始,直到完成x成員。這是測試工作但排序如此巨大的文件將殺死我們的機器幾個小時。

    1. 將數據加載到sql中,逐個讀入到C++成員對象中,批量加載mongo中的數據。經過測試和工作,但我想避免這一點。

    2. 負載在單獨的收藏蒙戈的文件並執行地圖還原出參數wrtie收藏。我已經加載了文檔(如上所示),併爲每個文件提供了自己的集合。不幸的是,我對mongo和截止日期是新手。地圖縮減的概念對我來說很難包圍和實施。我已閱讀文檔和使用的堆棧溢出MongoDB: Combine data from multiple collections into one..how?

輸出成員集合應該是這樣的這個答案嘗試。

{"userid":"aaa4444", 
"gender":"female", 
"dob":19901225, 
"beneficiaries":[{"start_date":20000101, 
        "end_date":20080227}, 
        {"start_date":20008101, 
        "end_date":00000000}], 
"claims":[{"date":20080514, 
     "code":"d4rd3", 
     "blah":"data"}, 
     {"date":20080514, 
     "code":"d4rd3", 
     "blah":"data"}], 
"labs":[{"date":20080514, 
     "lab":"mri", 
     "blah":"data"}]} 

將負載數據的性能加載到sql,在C++中讀入並插入到mongodb中是否擊敗映射?如果是的話,我會用這種方法

回答

0

恕我直言堅持,你的數據都不錯的候選人的map-reduce,因此將是更好的去選擇3:加載中蒙戈的文件在3個單獨的集合:beneficiariesclaimslabs和對每個集合上的userid鍵執行map-reduce。最後,使用查找並插入userid密鑰,將3個集合中的數據集成到單個集合中。受益人

假設你加載beneficiaries.csv到收集beneficiaries,這是示例代碼的map-reduce:

mapBeneficiaries = function() { 
    var values = { 
     start_date: this.start_date, 
     end_date: this.end_date, 
     userid: this.userid, 
     gender: this.gender, 
     dob: this.dob 
    }; 
    emit(this.userid, values); 
}; 

reduce = function(k, values) { 
    list = { beneficiaries: [], gender : '', dob: ''}; 
    for(var i in values) { 
    list.beneficiaries.push({start_date: values[i].start_date, end_date: values[i].end_date}); 
    list.gender = values[i].gender; 
    list.dob = values[i].dob; 
    } 
    return list; 
}; 

db.beneficiaries.mapReduce(mapBeneficiaries, reduce, {"out": {"reduce": "mr_beneficiaries"}}); 

mr_beneficiaries輸出將是這樣的:

{ 
    "_id" : "a9dk4kJkj", 
    "value" : { 
     "beneficiaries" : [ 
      { 
       "start_date" : 20080201, 
       "end_date" : 0 
      }, 
      { 
       "start_date" : 20080201, 
       "end_date" : 0 
      } 
     ], 
     "gender" : "male", 
     "dob" : 20080514 
    } 
} 

照此要獲得的東西mp_claimsmp_labs。然後集成到singledocuments

db.mr_beneficiaries.find().forEach(function(doc) { 
    var id = doc._id; 
    var claims = db.mr_claims.findOne({"_id":id}); 
    var labs = db.mr_lab.findOne({"_id":id}); 
    db.singledocuments.insert({"userid":id, 
         "gender":doc.value.gender, 
         "dob":doc.value.dob, 
         "beneficiaries":doc.value.beneficiaries, 
         "claims":claims.value.claims, 
         "labs":labs.value.labs}); 
}); 
+0

我不能使用地圖縮減插入索賠和實驗室?不會跑得更快 – user1290942 2014-12-05 23:14:53

+0

也我會找到一個不會做它有多個索賠和多個實驗室 – user1290942 2014-12-06 00:08:10

+0

在mapreduce後,你將有一個索賠/實驗室列表每個用戶ID所以findOne很好 – anhlc 2014-12-06 01:11:34