Amazon web services 在S3中连接JSON文件
我有一个工作流,它正在旋转一组并行lambda函数以快速批处理数据,这些函数正在命中一个服务,然后在一个S3 bucket中写入JSON响应。因此,我可以拥有数千个5MB+的JSON文件 现在,我需要将所有这些文件聚合成一个可以返回给请求者的JSON文件 我正试图用这样做,所以我不必下载、处理和重新上传文件。相反,我可以在S3中通过将部分复制到最终文件来完成这一切。这实际上非常有效,但问题是结果不再是有效的JSON,因为它实际上只是将文件粘在一起,而不是合并JSON数组(见下文) 例如: 文件1:Amazon web services 在S3中连接JSON文件,amazon-web-services,amazon-s3,aws-lambda,Amazon Web Services,Amazon S3,Aws Lambda,我有一个工作流,它正在旋转一组并行lambda函数以快速批处理数据,这些函数正在命中一个服务,然后在一个S3 bucket中写入JSON响应。因此,我可以拥有数千个5MB+的JSON文件 现在,我需要将所有这些文件聚合成一个可以返回给请求者的JSON文件 我正试图用这样做,所以我不必下载、处理和重新上传文件。相反,我可以在S3中通过将部分复制到最终文件来完成这一切。这实际上非常有效,但问题是结果不再是有效的JSON,因为它实际上只是将文件粘在一起,而不是合并JSON数组(见下文) 例如: 文件1
[
{
"foo": "bar1"
},
{
"foo": "bar2"
}
]
[
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
[
{
"foo": "bar1"
},
{
"foo": "bar2"
}
][
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
[
{
"foo": "bar1"
},
{
"foo": "bar2"
},
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
文件2:
[
{
"foo": "bar1"
},
{
"foo": "bar2"
}
]
[
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
[
{
"foo": "bar1"
},
{
"foo": "bar2"
}
][
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
[
{
"foo": "bar1"
},
{
"foo": "bar2"
},
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
多部分上传的结果:
[
{
"foo": "bar1"
},
{
"foo": "bar2"
}
]
[
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
[
{
"foo": "bar1"
},
{
"foo": "bar2"
}
][
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
[
{
"foo": "bar1"
},
{
"foo": "bar2"
},
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
正如您在上面看到的,我现在使用了无效的JSON,一个文件的结束括号和另一个文件的开始括号代替了逗号
我想要的结果:
[
{
"foo": "bar1"
},
{
"foo": "bar2"
}
]
[
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
[
{
"foo": "bar1"
},
{
"foo": "bar2"
}
][
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
[
{
"foo": "bar1"
},
{
"foo": "bar2"
},
{
"foo": "bar3"
},
{
"foo": "bar4"
}
]
现在我被困在该怎么办上了。3GB的RAM限制意味着我可能无法只打开每个文件并在内存中构建最终结果,然后写入S3,因为它很容易>3GB
是否有我忽略的选项,或者我只是需要编写一些讨厌的代码来暴力破解它
我能想到的唯一一件事(我真的不想做)是格式化第一个没有结束括号的文件,中间的文件没有括号,最后一个文件没有开始括号
Head file
[
{
"foo": "bar1"
},
Any middle files
{
"foo": "bar2"
},
Final file
{
"foo": "barN"
}
]
因此,当我通过多部分复制进行连接时,它将是正确的
[
{
"foo": "bar1"
},
{
"foo": "bar2"
},
{
"foo": "barN"
}
]
foo/bar对象是否始终是一个键/值对,每次都具有完全相同的键(以及可能不同的值)?是。所有文件都是根据API请求创建的,因此它们都将具有相同的架构。我认为您必须按照您描述的方式执行,并根据需要手动删除
[]
。但是,您不必担心会达到内存限制,因为您应该只在内存中加载一个文件(多部分上载的一部分)。完成部分上传后,可以释放内存。@MilanCermak-我可能可以通过不使用括号编写响应部分并始终使用逗号(上面的“中间文件”方法)来提高效率。那么我只需要根据需要编辑第一个和最后一个文件。好的,如果所有文件本质上都是具有相同密钥的key=value对数组,那么您可以简单地将值列表写入每个文件。这将使连接它们变得简单,结果文件也将是一个值列表。读取该文件要比读取3GB JSON文件简单,因为您可以逐行流式处理该文件,而不必一次加载整个3GB以确保它实际上是有效的JSON(这是典型的JSON解析器所做的)。