Используя ссылку на коллекцию ADF, мы переносим это в формат json. хотя это работает для нескольких записей. Не удается выполнить 1 запись xml.
Ошибка: ErrorCode=UserErrorInvalidPathForCollectionReferenceNode,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Invalid json path '$['file-data']['files']['row']' для ссылочного узла коллекции.
Пример файла для двух строк, который работает, приведен ниже.
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<file-data xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
<files>
<row record = "01">
<FilePath>/MYDIRECTORY/MYTest/</FilePath>
<ValidatedBy>Joe Blogg</ValidatedBy>
</row>
<row record = "02">
<FilePath>/MYDIRECTORY/MYTest01/</FilePath>
<ValidatedBy>Jose</ValidatedBy>
</row>
</files>
</file-data>
Это не работает.
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<file-data xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
<files>
<row record = "01">
<FilePath>/MYDIRECTORY/MYTest/</FilePath>
<ValidatedBy>Joe Blogg</ValidatedBy>
</row>
</files>
</file-data>
требуется образец вывода
{"FilePath":"/MYDIRECTORY/MYTest/","ValidatedBy":"Joe Blogg"}
Об этом также сообщалось здесь Фабрика данных Azure — ссылка на сбор не работает, когда только 1 запись
любые предложения
При определении ссылки на коллекцию как $['file-data']['files']['row']
, если есть только 1 строка, она рассматривается как объект, а не как массив, что может быть причиной получения вышеуказанной ошибки. Чтобы получить необходимый результат, выполните следующую процедуру:
Перейдите к сопоставлению, сделайте ссылку на коллекцию пустой, включите расширенный редактор и определите столбцы, как показано ниже:
Путь к файлу --> $['file-data']['files']['row']['FilePath']
ValidatedBy --> $['file-data']['files']['row']['ValidatedBy']
Вы получите Json, как показано ниже:
{"FilePath":"/MYDIRECTORY/MYTest/","ValidatedBy":"Joe Blogg"}
Используйте активность поиска для чтения файла. Подсчитайте количество строк в файле, используя @length(activity('Lookup1').output.value[0]['file-data'].files.row)
После прочтения файла добавьте активность if к активности поиска с условием:
@greater(length(activity('Lookup1').output.value[0]['file-data'].files.row),1)
Чтобы проверить количество строк больше 1 или нет. Если это правда, добавьте действие копирования с необходимым источником с приведенным ниже сопоставлением:
Если false, добавьте действие копирования с необходимым источником с приведенным ниже сопоставлением:
Тогда он будет работать в зависимости от количества строк. Вот конвейер Json для вашего требования:
{
"name": "pipeline4",
"properties": {
"activities": [
{
"name": "Lookup1",
"type": "Lookup",
"dependsOn": [],
"policy": {
"timeout": "0.12:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": false,
"secureInput": false
},
"userProperties": [],
"typeProperties": {
"source": {
"type": "XmlSource",
"storeSettings": {
"type": "AzureBlobFSReadSettings",
"recursive": true,
"enablePartitionDiscovery": false
},
"formatSettings": {
"type": "XmlReadSettings",
"validationMode": "none",
"namespaces": true
}
},
"dataset": {
"referenceName": "Xmlmulr",
"type": "DatasetReference"
},
"firstRowOnly": false
}
},
{
"name": "If Condition1",
"type": "IfCondition",
"dependsOn": [
{
"activity": "Lookup1",
"dependencyConditions": [
"Succeeded"
]
}
],
"userProperties": [],
"typeProperties": {
"expression": {
"value": "@greater(length(activity('Lookup1').output.value[0]['file-data'].files.row),1)",
"type": "Expression"
},
"ifFalseActivities": [
{
"name": "Copy data1_copy1",
"type": "Copy",
"dependsOn": [],
"policy": {
"timeout": "0.12:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": false,
"secureInput": false
},
"userProperties": [],
"typeProperties": {
"source": {
"type": "XmlSource",
"storeSettings": {
"type": "AzureBlobFSReadSettings",
"recursive": true,
"enablePartitionDiscovery": false
},
"formatSettings": {
"type": "XmlReadSettings",
"validationMode": "none",
"namespaces": true
}
},
"sink": {
"type": "JsonSink",
"storeSettings": {
"type": "AzureBlobFSWriteSettings"
},
"formatSettings": {
"type": "JsonWriteSettings"
}
},
"enableStaging": false,
"translator": {
"type": "TabularTranslator",
"mappings": [
{
"source": {
"path": "$['file-data']['files']['row']['FilePath']"
},
"sink": {
"path": "FilePath"
}
},
{
"source": {
"path": "$['file-data']['files']['row']['ValidatedBy']"
},
"sink": {
"path": "ValidatedBy"
}
}
],
"collectionReference": ""
}
},
"inputs": [
{
"referenceName": "Xml1",
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "Json1",
"type": "DatasetReference"
}
]
}
],
"ifTrueActivities": [
{
"name": "Copy data1",
"type": "Copy",
"dependsOn": [],
"policy": {
"timeout": "0.12:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": false,
"secureInput": false
},
"userProperties": [],
"typeProperties": {
"source": {
"type": "XmlSource",
"storeSettings": {
"type": "AzureBlobFSReadSettings",
"recursive": true,
"enablePartitionDiscovery": false
},
"formatSettings": {
"type": "XmlReadSettings",
"validationMode": "none",
"namespaces": true
}
},
"sink": {
"type": "JsonSink",
"storeSettings": {
"type": "AzureBlobFSWriteSettings"
},
"formatSettings": {
"type": "JsonWriteSettings"
}
},
"enableStaging": false,
"translator": {
"type": "TabularTranslator",
"mappings": [
{
"source": {
"path": "['FilePath']"
},
"sink": {
"path": "FilePath"
}
},
{
"source": {
"path": "['ValidatedBy']"
},
"sink": {
"path": "ValidatedBy"
}
}
],
"collectionReference": "$['file-data']['files']['row']"
}
},
"inputs": [
{
"referenceName": "Xmlmulr",
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "Json1",
"type": "DatasetReference"
}
]
}
]
}
}
],
"variables": {
"rowcount": {
"type": "Integer"
},
"row": {
"type": "String"
},
"r1": {
"type": "Array"
}
},
"annotations": []
}
}
@nick leeson обновил мой ответ, пожалуйста, проверьте его один раз. Дайте мне знать, соответствует ли он вашим требованиям или нет.
Я искал динамическое решение, которое будет обрабатывать оба сценария, то есть две строки и одну строку. Пока два ряда работают, один не работает. Извините за путаницу