首页 > 解决方案 > 在 S3 中连接 JSON 文件

问题描述

我有一个工作流程,它正在启动一堆并行 lambda 函数以快速批处理数据,这些数据正在访问服务,然后将 JSON 响应写入 S3 存储桶。因此,我可以拥有数千个 5MB 以上的 JSON 文件。

现在,我需要将所有这些文件聚合到一个可以返回给请求者的 JSON 文件中。

我试图通过MultiPart Upload来执行此操作,因此我不必下载、处理和重新上传文件。相反,我可以通过将部件复制到最终文件来仅在 S3 中完成所有操作。这实际上效果很好,但问题是结果不再是有效的 JSON,因为它实际上只是将文件粘在一起而不合并 JSON 数组(见下文)。

例如:

文件 1:

[
    {
    "foo": "bar1"
    },
    {
    "foo": "bar2"
    }
]

文件 2:

[
    {
    "foo": "bar3"
    },
    {
    "foo": "bar4"
    }
]

分段上传结果:

[
    {
    "foo": "bar1"
    },
    {
    "foo": "bar2"
    }
][
    {
    "foo": "bar3"
    },
    {
    "foo": "bar4"
    }
]

正如您在上面看到的,我现在有一个无效的 JSON,其中一个文件的结束括号和另一个文件的开始括号而不是逗号。

我想要的结果:

[
    {
    "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"
    }
]

因此,当我通过 Multipart Copy 进行连接时,它将是正确的......

[
    {
        "foo": "bar1"
    },
    {
        "foo": "bar2"
    },
    {
        "foo": "barN"
    }
]

标签: amazon-web-servicesamazon-s3aws-lambda

解决方案


推荐阅读