【发布时间】:2016-02-25 05:28:29
【问题描述】:
我有一个 12 GB 的文件,其中每一行都是一个 JSON 对象,格式如下:
{
"name": "abc",
"val1":500,
"val2":30,
"val3":{
"topic1":{
"val4":["abc","xyz"],
"val5":["asdf"]
}
}
}
不幸的是,这是对象结构,无法更改。
假设我在这个文件中有另一行:
{
"name": "abc",
"val1":300,
"val2":10,
"val3":{
"topic2":{
"val4":["hello","world"],
"val5":["test"]
}
}
}
我现在需要合并具有相同名称的对象,以便获得以下形式的对象:
{
"name": "abc",
"val1":800,
"val2":40,
"val3":{
"topic1":{
"val4":["abc","xyz"],
"val5":["asdf"]
},
"topic2":{
"val4":["hello","world"],
"val5":["test"]
}
}
}
我正在逐行读取文件并在 Python 中加载每一行的 JSON 对象。所以每一行基本上都变成了 Python dict()。然后我将此对象存储在 MongoDB 集合中,如果文件中出现另一个具有相同名称的对象,我将更新 Mongo 记录,以便将其合并,如上例所示。
我正在尝试采用与 Integrating multiple dictionaries in python (big data) 相同的方法,但我使用 Mongodb 来适应某些值的对象结构。但是,即使对于 400 MB 的示例文件,这也很慢。
有什么方法可以更好地做到这一点,也许使用某种并行处理?
【问题讨论】:
-
不太清楚你在问什么。数据是否已经导入到 MongoDB 集合中?在任何一种情况下,您是否还意味着 { "name": "abc", "val3": { "topic1": { "val4": ["efg","abc"] } } }` 将与上述结合一个“val4”数组是
["abc","xyz",efg"]?还是什么? -
无论如何,
mapReduce可能不是一个“好”的选择,考虑到所有输出“必须”本质上是 {"_id": "something", "value": "somethingElse" },因为_id和value都是强制性的作为结构,无论它们包含什么。因此,如果您的目标是新系列,则不是最佳选择。但如果你能忍受,那就没问题了。 -
不,数据存在于文件中。我正在尝试使用 MongoDB 组合这些行。组合将是 { "name": "abc", "val3": { "topic1":{ "val4":["abc","xyz"], "val5":["asdf"]} , "topic2 ":{"val4": ["efg", "abc"]}}} 。具有相同“名称”字段的两个对象在“val3”中不会都具有“topic1”(或任何相同的键)。
-
为了澄清,我试图将具有相同“名称”字段的多个此类对象组合成一个对象。为此,我需要在它们是数字的地方添加值,并在它是嵌套对象的地方组合值
-
对不起,但真的很清楚,你也应该清楚是否最终将信息存储在 MongoDB 中是你的“意图”。如果不是,而您只是在考虑使用“工具”,那么这有点像用电锯切三明治。通过将对象包含在您的“问题”正文中并在其中添加 edit 而不是在 cmets 中,您关于对象如何“合并”的示例将更加清晰。
标签: python json mongodb dictionary