Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在S3中连接JSON文件_Amazon Web Services_Amazon S3_Aws Lambda - Fatal编程技术网

Amazon web services 在S3中连接JSON文件

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

我有一个工作流,它正在旋转一组并行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解析器所做的)。