Я работаю над этим уже пару дней и обращаюсь за помощью. Мне не удалось правильно структурировать формат, и мне нужна помощь.
Я пытался создать структуру 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? Любые рекомендации будут очень признательны.
Привет @RakeshGovindula! В потоке данных ADF я использую производный столбец для структурирования JSON с помощью построителя выражений. Затем этот JSON преобразуется в файл и сохраняется в хранилище BLOB-объектов.
Однако я получаю сообщение об ошибке в строке
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. Однако прямо перед приемником у меня есть агрегатная функция, которая выполняет функцию сбора данных, поэтому я получаю ожидаемые данные, как я опубликовал в следующем комментарии. Если я удалю эту агрегатную функцию, я получу данные, как вы указали на скриншоте. Но мне нужен этот формат списка, разделенного запятыми.
{ "data": [ { "entity_id": "value1", "link_id": "value2", "url": "value3", "actions": [ { "appointment_info": {} } ] }, { "entity_id ": "value1", "link_id": "value2", "url": "value3", "actions": [ { "appointment_info": {} } ] } ] }
AFAIK, невозможно получить данные пустого объекта в потоке данных. Единственное, что вы можете сделать, это сохранить данные в виде файла JSON, а затем использовать другой поток данных и обработать его в соответствии с вашим аггрегированием.
После преобразования его в строку JSON я попытался преобразовать его обратно в JSON, используя преобразование синтаксического анализа. Но он выдает ту же ошибку, что и пустой объект JSON. Таким образом, использование JSON из файла может помочь выполнить ваше требование.
Спасибо, Ракеш, за исследование этого вопроса. Очень ценю ваше время и усилия. Я попробовал все это. Единственная проблема заключалась в агрегировании/сборе данных. Однако я нашел обходной путь, чтобы добиться того же. Опубликую это как ответ.
В построителе выражений я структурировал его следующим образом:
@(entity_id=value1,
link_id=value2,
url=value3,
actions=[@(appointment_info=@(appointment_null=appointment_null))])
Я добавил новый столбец в запрос выбора источника и получил нулевое значение. Поскольку столбец имеет значение NULL для всех строк, он всегда будет отображаться как {}. Однако это не сработает для пустой строки.
выберите '' назначение_пустой, ноль назначение_нуль из .........
назначение_пустой будет отображать имя столбца, а назначение_нуль — нет.
Вы можете принять свой ответ как принятый, поскольку он может помочь другим членам сообщества, столкнувшимся с той же проблемой.
@RakeshGovindula: Это не похоже на (полный) ответ, а скорее на то, что они попробовали, что добилось определенного прогресса, но все еще имеет проблемы. Или я неправильно понимаю? Возможно, это ответ, только с некоторыми признанными ограничениями? В любом случае, редактирование прояснит намерение.
Используете ли вы для этого построитель выражений конвейера ADF или поток данных ADF? и какая у вас здесь целевая база данных? Это база данных SQL или файл JSON для BLOB-объекта или gen2?