我试图分析一个巨大的JSON文件(大约4 GB)中的数据,我目前的解决方案是:
1.设置AWS EventBridge规则,一旦JSON文件上传到S3存储桶,此规则将触发Step Functions。
- Step Functions中唯一的一步是Map(包含一个Lambda),它可以从EventBridge中获取bucket名称和键,然后从JSON数组中获取项目(我只是从Workflow Studio Portal中的Patterns中拖放“Process JSON file in S3”)。
我还在ASL中设置了ItemsPath属性,以指示JSON文件中JSON数组的路径。
到目前为止,ASL看起来像:
{
"Comment": "A description of my state machine",
"StartAt": "Json File Analysis",
"States": {
"Json File Analysis": {
"Type": "Map",
"ItemsPath": "$.users",
"ItemProcessor": {
"ProcessorConfig": {
"Mode": "DISTRIBUTED",
"ExecutionType": "STANDARD"
},
"StartAt": "Decode Json Node",
"States": {
"Decode Json Node": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"OutputPath": "$.Payload",
"Parameters": {
"Payload.$": "$",
"FunctionName": "arn:aws:lambda:eu-east-1:1234567890:function:user-data-analysis-lambda:$LATEST"
},
"Retry": [
{
"ErrorEquals": [
"Lambda.ServiceException",
"Lambda.AWSLambdaException",
"Lambda.SdkClientException",
"Lambda.TooManyRequestsException"
],
"IntervalSeconds": 1,
"MaxAttempts": 3,
"BackoffRate": 2
}
],
"End": true
}
}
},
"ItemReader": {
"Resource": "arn:aws:states:::s3:getObject",
"ReaderConfig": {
"InputType": "JSON"
},
"Parameters": {
"Bucket.$": "$.detail.bucket.name",
"Key.$": "$.detail.object.key"
}
},
"MaxConcurrency": 1000,
"Label": "JsonFileAnalysis",
"End": true
}
}
}
字符串
然而,在我做了测试之后,我发现了一些奇怪的情况:
1.如果我上传了一个JSON文件,它的结构看起来像这样:
{
"datetime": "datetime",
"users": [{UserDataJsonObject}, {UserDataJsonObject}, {UserDataJsonObject}...]
}
型
执行步骤函数失败,错误为:尝试Map不可迭代的节点。
1.如果我上传了JSON文件,它是一个JSON数组,如:
[
{UserDataJsonObject},
{UserDataJsonObject},
{UserDataJsonObject}
...
]
型
这个功能可以工作。
我很困惑,为什么我已经设置了ItemsPath。JSON文件的结构是不可更改的。我该如何解决这个问题?
1条答案
按热度按时间drnojrws1#
您面临的问题似乎与JSON文件的结构以及Step Functions如何解释它有关。“尝试Map不可迭代节点”错误表明Step Functions期望在指定的ItemsPath处有一个可迭代节点,但它没有找到。在第一种情况下,JSON文件的结构如下:
{“datetime”:“datetime”,“users”:[{UserDataJsonObject},{UserDataJsonObject},{UserDataJsonObject}.] }
Step Functions期望在“ItemsPath”指定的路径上有一个可迭代节点:“$.users”,但它似乎没有找到一个,这就是导致错误的原因。在第二种情况下,JSON文件是一个JSON数组,如:
字符串
Step Functions能够工作是因为它在JSON数组的根位置找到了可迭代节点。若要解决此问题,您可能需要修改JSON文件的结构或调整Step Functions状态机中的ItemsPath以正确指向可迭代节点。如果JSON文件的结构不可更改,在将JSON文件传递给Step Functions之前,您可能需要对其进行预处理,以确保ItemsPath指向正确的可迭代节点。您可能还需要考虑使用不同的方法来处理JSON文件,例如使用自定义Lambda函数来处理JSON解析和处理,特别是如果JSON文件的结构是固定的,无法修改。我希望这有助于解决问题!如果您有任何进一步的问题或需要额外的帮助,请随时询问。