如何使用Step Functions的Map函数解析JSON文件中的JSON数组

mfpqipee  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(78)

我试图分析一个巨大的JSON文件(大约4 GB)中的数据,我目前的解决方案是:
1.设置AWS EventBridge规则,一旦JSON文件上传到S3存储桶,此规则将触发Step Functions。

  1. 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文件的结构是不可更改的。我该如何解决这个问题?

drnojrws

drnojrws1#

您面临的问题似乎与JSON文件的结构以及Step Functions如何解释它有关。“尝试Map不可迭代节点”错误表明Step Functions期望在指定的ItemsPath处有一个可迭代节点,但它没有找到。在第一种情况下,JSON文件的结构如下:
{“datetime”:“datetime”,“users”:[{UserDataJsonObject},{UserDataJsonObject},{UserDataJsonObject}.] }
Step Functions期望在“ItemsPath”指定的路径上有一个可迭代节点:“$.users”,但它似乎没有找到一个,这就是导致错误的原因。在第二种情况下,JSON文件是一个JSON数组,如:

[
    {UserDataJsonObject},
    {UserDataJsonObject},
    {UserDataJsonObject}
    ...
]

字符串
Step Functions能够工作是因为它在JSON数组的根位置找到了可迭代节点。若要解决此问题,您可能需要修改JSON文件的结构或调整Step Functions状态机中的ItemsPath以正确指向可迭代节点。如果JSON文件的结构不可更改,在将JSON文件传递给Step Functions之前,您可能需要对其进行预处理,以确保ItemsPath指向正确的可迭代节点。您可能还需要考虑使用不同的方法来处理JSON文件,例如使用自定义Lambda函数来处理JSON解析和处理,特别是如果JSON文件的结构是固定的,无法修改。我希望这有助于解决问题!如果您有任何进一步的问题或需要额外的帮助,请随时询问。

相关问题