Слияние выходных данных JSON параллельных состояний в пошаговой функции - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть параллельный блок в пошаговой функции. Вход в параллельный блок выглядит как

{ "a": null, "b": null }

2 параллельных состояния: populateA и populateB . Выходные данные populateA равны

{ "a": "A", "b": null } 

. Выходные данные populateB равны

{ "a": null, "b": "B" }

Выходные данные параллельного блока представляют собой массив.

[ { "a": "A", "b": null }, { "a": null, "b": "B" } ]

Как мне объединить два в

{ "a": "A", "b": "B" }

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Если PopulateA всегда заполняет только значение a, а PopulateB только значение b, вы можете использовать состояние Pass с параметрами (вместо поля Result) после вашего параллельного состояния для объединения входов. Параметры позволяют преобразовать ваш ввод, указав пары ключ-значение с помощью JSONPath.

Вот пример конечного автомата:

{
"StartAt": "Parallel",
"States": {
    "Parallel": {
        "Type": "Parallel",
        "ResultPath": "$.CombinedOutput",
        "Next": "MergeOutputs",
        "Branches": [{
                "StartAt": "populateA",
                "States": {
                    "populateA": {
                        "Type": "Pass",
                        "Result": {
                            "a": "A",
                            "b": null
                        },
                        "End": true
                    }
                }
            },
            {
                "StartAt": "populateB",
                "States": {
                    "populateB": {
                        "Type": "Pass",
                        "Result": {
                            "a": null,
                            "b": "B"
                        },
                        "End": true
                    }
                }
            }
        ]
    },
    "MergeOutputs": {
        "Type": "Pass",
        "Parameters": {
            "a.$": "$.CombinedOutput[0].a",
            "b.$": "$.CombinedOutput[1].b"
        },
        "Next": "EndState"
    },
    "EndState": {
        "Type": "Pass",
        "End": true
    }
  }
}
0 голосов
/ 09 ноября 2019

Боюсь, что (в настоящее время) это невозможно сделать без дополнительного состояния. Вы можете добавить дополнительную задачу после состояния Parallel, которая объединит элементы массива.

Код дополнительной задачи будет выглядеть следующим образом (Python):

def merge_dicts(a, b):
    result = a.copy()
    for key, value in b.items():
        if value is not None:
            result[key] = value
    return result

def handler(event, context):
    result = {}
    for item in event:
        result = merge_dicts(result, item)
    return result

handler принимает выходные данные изПараллельные состояния и объединяет его в один словарь. Состояние должно быть непосредственно после Parallel.

Имейте в виду, что этот код обрабатывает только flat-dict (не вложенные), поэтому он будет работать в простых случаях, но не в сложных (я добавил его только здесьпоказать общую идею).

...