Построитель выражений фабрики данных Azure: ошибка структурирования JSON с помощью вложенных массивов и объектов

Я работаю над этим уже пару дней и обращаюсь за помощью. Мне не удалось правильно структурировать формат, и мне нужна помощь.

Я пытался создать структуру JSON в Фабрике данных Azure (ADF) с помощью построителя выражений, но столкнулся с ошибкой. Вот структура JSON, которую я хочу получить:

{
  "entity_id": "value1",
  "link_id": "value2",
  "url": "value3",
  "actions": [
    {
      "appointment_info": {}
    }
  ]
}

В построителе выражений я структурировал его следующим образом:

@(entity_id=entity_id,
  link_id=link_id,
  url=url,
  actions=[@(appointment_info=@())])

Однако я получаю сообщение об ошибке в строке actions=[@(appointment_info=@())], а именно в строке @() сразу после appointment_info=. Это должно работать, но в ADF по-прежнему отображается ошибка, и я не могу структурировать ее должным образом:

"actions": [
  {
    "appointment_info": {}
  }
]

Может ли кто-нибудь помочь мне понять, что я делаю неправильно и как правильно отформатировать эту структуру JSON в построителе выражений ADF? Любые рекомендации будут очень признательны.

Используете ли вы для этого построитель выражений конвейера ADF или поток данных ADF? и какая у вас здесь целевая база данных? Это база данных SQL или файл JSON для BLOB-объекта или gen2?

Rakesh Govindula 25.07.2024 11:46

Привет @RakeshGovindula! В потоке данных ADF я использую производный столбец для структурирования JSON с помощью построителя выражений. Затем этот JSON преобразуется в файл и сохраняется в хранилище BLOB-объектов.

Shobith k Chandran 25.07.2024 13:19
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
2
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Однако я получаю сообщение об ошибке в строке actions=[@(appointment_info=@())], а именно в строке @() сразу после appointment_info=.

Я попробовал то же выражение, и оно говорит о неправильной ошибке синтаксического анализа. Похоже, что выражение столбца, полученного из потока данных ADF, не поддерживает пустые objects.

Если у вас есть доступ к учетной записи хранения Blob или Gen2, вы можете попробовать описанный ниже обходной путь, чтобы выполнить это требование.

Сначала используйте приведенное ниже выражение в преобразовании производного столбца.

replace(toString(@(entity_id=entity_id,
link_id=link_id,
url=url,
actions=[@(appointment_info='my_str')])),'"my_str"','{}')

Поскольку оно не поддерживает пустой объект, приведенное выше выражение сначала генерирует необходимый JSON со строкой "my_str" вместо {}. Затем замените его на {} и получите строку JSON в столбце.

Затем используйте преобразование выбора и удалите лишние столбцы.

В приемнике потока данных возьмите набор текстовых данных с разделителями и задайте приведенные ниже конфигурации. Этот набор данных должен быть из Gen2 или большого двоичного объекта.

Не указывайте для этого имя файла в наборе данных. Укажите имя файла как filename.json в настройках приемника потока данных.

Здесь мы используем набор текстовых данных с разделителями для создания файла JSON из созданной нами строки JSON. Поскольку мы сняли флажок «Первая строка как заголовок», файл JSON будет получен, как и ожидалось.

Файл результатов:

Но при дальнейшем использовании этого файла в ADF вам потребуется создать другой набор данных JSON, указывающий на это место.

Спасибо, @RakeshGovindula. Решение, которое вы опубликовали, сработало. Я могу получить данные, как показано на последнем снимке экрана targetjson1.json. Однако прямо перед приемником у меня есть агрегатная функция, которая выполняет функцию сбора данных, поэтому я получаю ожидаемые данные, как я опубликовал в следующем комментарии. Если я удалю эту агрегатную функцию, я получу данные, как вы указали на скриншоте. Но мне нужен этот формат списка, разделенного запятыми.

Shobith k Chandran 25.07.2024 22:05

{ "data": [ { "entity_id": "value1", "link_id": "value2", "url": "value3", "actions": [ { "appointment_info": {} } ] }, { "entity_id ": "value1", "link_id": "value2", "url": "value3", "actions": [ { "appointment_info": {} } ] } ] }

Shobith k Chandran 25.07.2024 22:10

AFAIK, невозможно получить данные пустого объекта в потоке данных. Единственное, что вы можете сделать, это сохранить данные в виде файла JSON, а затем использовать другой поток данных и обработать его в соответствии с вашим аггрегированием.

Rakesh Govindula 26.07.2024 05:20

После преобразования его в строку JSON я попытался преобразовать его обратно в JSON, используя преобразование синтаксического анализа. Но он выдает ту же ошибку, что и пустой объект JSON. Таким образом, использование JSON из файла может помочь выполнить ваше требование.

Rakesh Govindula 26.07.2024 05:39

Спасибо, Ракеш, за исследование этого вопроса. Очень ценю ваше время и усилия. Я попробовал все это. Единственная проблема заключалась в агрегировании/сборе данных. Однако я нашел обходной путь, чтобы добиться того же. Опубликую это как ответ.

Shobith k Chandran 26.07.2024 09:26
Ответ принят как подходящий

В построителе выражений я структурировал его следующим образом:

@(entity_id=value1,
    link_id=value2,
    url=value3,
    actions=[@(appointment_info=@(appointment_null=appointment_null))])

Я добавил новый столбец в запрос выбора источника и получил нулевое значение. Поскольку столбец имеет значение NULL для всех строк, он всегда будет отображаться как {}. Однако это не сработает для пустой строки.

выберите '' назначение_пустой, ноль назначение_нуль из .........

назначение_пустой будет отображать имя столбца, а назначение_нуль — нет.

Вы можете принять свой ответ как принятый, поскольку он может помочь другим членам сообщества, столкнувшимся с той же проблемой.

Rakesh Govindula 26.07.2024 12:15

@RakeshGovindula: Это не похоже на (полный) ответ, а скорее на то, что они попробовали, что добилось определенного прогресса, но все еще имеет проблемы. Или я неправильно понимаю? Возможно, это ответ, только с некоторыми признанными ограничениями? В любом случае, редактирование прояснит намерение.

Jeremy Caney 27.07.2024 02:30

Другие вопросы по теме