我将得到的这些文件每个至少有一百万行,最多 15 亿行。当我得到它时,数据被规范化。我需要一种方法将其存储在一个文档中。在大多数情况下,我不是 100% 如何将数据提供给我。它可以是csv,固定宽度文本文件或tsv或其他东西。
目前,我有一些从一些示例CSV导入的集合。
波纹管是我数据缺失字段的一小部分表示
形式在我的利益中.csv数据重复
受益者.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
声明.csv超过 2 亿条记录
{"userid":"a9dk4kJkj",
"date":20080514,
"code":"d4rd3",
"blah":"data"}
实验室.csv超过 1000 万条记录
{"userid":"a9dk4kJkj",
"date":20080514,
"lab":"mri",
"blah":"data"}
根据我有限的知识,我有三个选择
对文件进行排序,从数据文件中读取 C++ 成员对象中的 x 量,在 y 处停止,将成员插入 mongodb,继续从 y 开始表示 x 个成员,直到我们完成。这是经过测试和工作的,但对如此庞大的文件进行排序会杀死我们的机器数小时。
将数据加载到SQL,逐个读取到C ++成员对象中,在mongo中批量加载数据。经过测试并有效,但是,但我想非常避免这种情况。
将 MONGO 中的文档加载到单独的集合中,并使用 out 参数执行地图缩减以写入集合。我为每个文件加载了文档(如上所示(。不幸的是,我是蒙戈的新手,而且有截止日期。地图缩减的概念对我来说很难理解和实施。我已经阅读了文档并尝试在堆栈溢出MongoDB上使用此答案:将来自多个集合的数据合并为一个。如何?
输出成员集合应如下所示。
{"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 的性能会胜过地图缩减吗? 如果是这样,我会坚持使用这种方法
我直言,您的数据是map-reduce的良好候选者,因此最好选择选项3:在3个单独的集合中加载mongo中的文档:beneficiaries
,claims
,labs
并对每个集合的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_claims
和mp_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});
});