Azure | АПД | Как использовать строковую переменную для поиска ключа в параметре типа объекта и получения его значения - PullRequest
0 голосов
/ 26 мая 2020

Я использую Azure Фабрику данных. Я пытаюсь использовать переменную String для поиска ключа в массиве JSON и получения его значения. Кажется, я не понимаю, как это сделать в ADF.

Подробности:

Я определил параметр конвейера с именем «obj», введите «Object» и содержимое: {"values":{"key1":"value1","key2":"value2"}}

Определение параметра

Мне нужно использовать этот конвейер, чтобы найти значение с именем «key1» и вернуть его как «value1»; «ключ2» и вернуть его как «значение2» ... и так далее. Я планирую использовать свой "obj" в качестве словаря, чтобы выполнить sh this.

Технически говоря, если я хочу найти значение для key2, я могу использовать приведенный ниже код, и он будет должно быть возвращено «значение2»:

@pipeline().parameters.obj.values.key2

Я не могу понять, как это сделать с помощью переменной (вместо жестко запрограммированного «key2»).

Чтобы прояснить ситуацию: у меня есть for-l oop, а внутри него есть только действие копирования: для каждого содержимого Цель действия копирования - скопируйте файл с именем item().name, но сохраните его в ADLS как то, что item().name переводит в соответствии с "obj"

Вот как можно построить for-l oop, используя Python : python -for-l oop

В ADF я много чего пробовал (используя concat, replace ...), но ничего не помогло. Самым простым будет это:

@pipeline().parameters.obj.values.item().name

, но это вызывает следующую ошибку:

{"code":"BadRequest","message":"ErrorCode=InvalidTemplate, ErrorMessage=Unable to parse expression 'pipeline().parameters.obj.values.item().name'","target":"pipeline/name_of_the_pipeline/runid/run_id","details":null,"error":null}

Итак, не могли бы вы дать какие-либо идеи, как определить мое выражение ? Я чувствую, что это должно быть действительно очевидно, но я не понимаю ... Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 мая 2020

Привет, коллега Pythonista!

Решение в ADF на самом деле состоит в том, чтобы ссылаться так же, как в Python, заключив «переменную» в квадратные скобки.

Я создал конвейер с объект параметра, подобный вашему

enter image description here

и, в качестве демонстрации, конвейер имеет единственное действие Set Variable , получившее значение для key2 в переменную.

enter image description here enter image description here

Это задокументировано, но вам нужно рентгеновское зрение, чтобы обнаружить это здесь .

0 голосов
/ 27 мая 2020

Основываясь на ваших комментариях, это результат действия фильтра. Результат действия фильтра - это объект, содержащий массив с именем value, поэтому вам нужно перебрать "output.value": enter image description here

Внутри ForEach вы ссылаетесь на имя элемент с использованием "item (). name": enter image description here

РЕДАКТИРОВАТЬ НА ОСНОВЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ:

Задача теперь взять значение имени @item (). и используйте его как имя свойства c динамической обработки для массива JSON. Это небольшая проблема, учитывая ограниченный характер языка выражения конвейера (PEL). На элементы массива в PEL можно ссылаться только по их значению индекса, поэтому для выполнения такого сложного поиска вам потребуется l oop по массиву и выполнить некоторый синтаксический анализ строк. Поскольку вы уже находитесь внутри FOR l oop, а вложенные циклы FOR не поддерживаются, вам потребуется выполнить другой конвейер для обработки этого процесса И операции копирования. Предупреждение: это выглядит некрасиво, но работает.

Дочерний конвейер

Определите конвейер с двумя параметрами, одним для массива значений и одним для элемента (). Name : enter image description here

Когда вы выполняете дочерний конвейер, передайте @pipeline.parameters.obj.values как «valuesArray» и @ item () .name как «keyValue».

  1. Вам потребуется несколько операций синтаксического анализа строк, поэтому создайте несколько строковых переменных в конвейере: enter image description here

  2. В дочернем конвейере добавьте действие ForEach. Установите флажок Sequential и установите для Items значение параметра valuesArray: enter image description here

  3. Внутри ForEach начните с очистки текущего элемента и сохранения его как переменная, чтобы ее было немного легче использовать. enter image description here

  4. Разберите ключ объекта из переменной [здесь он начинает становиться немного уродливым]: enter image description here

  5. Добавьте условие IF для проверки значения текущего ключа в параметр keyValue: enter image description here

  6. Добавьте действие к ИСТИННОМУ условию, которое анализирует значение в переменную [здесь становится действительно уродливо]:

enter image description here

Между тем, вернемся к конвейеру

На этом этапе после ForEach у вас будет переменная (IterationValue), которая содержит правильное значение из исходного массива: enter image description here

Теперь, когда у вас есть это значение, вы можете использовать эту переменную в качестве параметра DataSet в действии Copy.

...