Использование действия копирования ADF с сопоставлением динамической схемы

Я пытаюсь управлять свойством columnMapping из таблицы конфигурации базы данных. Мое первое действие в конвейере извлекает строки из таблицы конфигурации. Источник моей активности копирования - это файл Json в хранилище BLOB-объектов Azure, а мой приемник - это база данных SQL Azure.

При копировании я устанавливаю сопоставление с помощью окна динамического содержимого. Код выглядит так:

"translator": {
    "value": "@json(activity('Lookup1').output.value[0].ColumnMapping)",
     "type": "Expression"
 }

У меня вопрос: как должно выглядеть значение activity ('Lookup1'). Output.value [0] .ColumnMapping?

Я пробовал несколько разных форматов json, но копирование всегда игнорирует его.

Например, я пробовал:

{
    "type": "TabularTranslator",
    "columnMappings": {
      "view.url": "url"
    }
}

а также:

"columnMappings": {
    "view.url": "url"
}

а также:

{
  "view.url": "url"
}

В этом примере view.url - это имя столбца в источнике JSON, а url - это имя столбца в моей целевой таблице в базе данных SQL Azure.


person typheon    schedule 02.07.2018    source источник


Ответы (3)


Проблема связана с точкой (.) В имени столбца.

  1. Чтобы использовать сопоставление столбцов, вы также должны указать структуру в исходном и приемном наборах данных.
  2. Для исходного набора данных необходимо правильно указать формат. И поскольку в имени вашего столбца есть точка, вам нужно указать путь json следующим образом. введите здесь описание изображения
  3. Вы можете использовать пользовательский интерфейс ADF, чтобы сначала настроить копию для одного файла, чтобы получить соответствующий формат, структуру и формат сопоставления столбцов. Затем измените его на поиск.

И, как я понимаю, ваш первый формат должен быть правильным. Если он уже находится в формате json, возможно, вам не нужно использовать функцию json в своем выражении.

person Fang Liu    schedule 03.07.2018
comment
Спасибо! В выражении JSONPath действительно была моя проблема. К сожалению, теперь я понимаю, что выражения JSONPath не поддерживают параметр динамического содержимого, поэтому я не думаю, что смогу управлять этим из своей базы данных конфигурации :( - person typheon; 03.07.2018
comment
Поскольку путь JSON не поддерживает динамический контент, я думаю, что это может быть проблема пользовательского интерфейса. Вы можете попробовать напрямую с json-кодом. - person Fang Liu; 03.07.2018
comment
@FangLiu Это не проблема пользовательского интерфейса. В продукте есть ошибка, из-за которой язык выражений игнорируется для имен столбцов сопоставления схемы. - person Don Scott; 03.01.2019

Похоже, между вопросом и ответом есть несоответствие, поэтому я надеюсь дать более простой ответ.

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

Внутри действия копирования отформатируйте динамический json следующим образом:

    {
      "structure": [
        {
          "name": "Address Number"
        },
        {
          "name": "Payment ID"
        },
        {
          "name": "Document Number"
        },
          ...
          ...
      ]
    }

Затем вы должны указать свое динамическое сопоставление следующим образом:

    {
      "translator": {
        "type": "TabularTranslator",
        "mappings": [
          {
            "source": {
              "name": "Address Number",
              "type": "Int32"
            },
            "sink": {
              "name": "address_number"
            }
          },
          {
            "source": {
              "name": "Payment ID",
              "type": "Int64"
            },
            "sink": {
              "name": "payment_id"
            }
          },
          {
            "source": {
              "name": "Document Number",
              "type": "Int32"
            },
            "sink": {
              "name": "document_number"
            }
          },
          ...
          ...
        ]
      }
    }

Предполагая, что они были установлены в отдельных переменных, вы захотите отправить источник как строку, а отображение как json:

источник: @string(json(variables('str_dyn_structure')).structure)

отображение: @json(variables('str_dyn_translator')).translator

person VladDrak    schedule 04.09.2019
comment
@ VladDrak Не могли бы вы привести пример полного блока JSON для операции копирования? Насколько я понимаю, из этой документации заключается в том, что раздел структуры должен быть частью определения набора данных, но я не вижу способа добавить его динамически. - person Jon.Mozley; 22.04.2020
comment
@ Jon.Mozley, вам нужно сохранить блок переводчика в переменной и добавить динамический контент в последнюю строку, показанную в ответе @json(variables('str_dyn_translator')).translator. Других вещей не требуется. В моем случае я устанавливаю переменную сопоставления из базы данных. - person Saumya Suhagiya; 01.10.2020

VladDrak - Вы можете пропустить динамическое определение источника, построив динамическое сопоставление следующим образом:

{
  "translator": {
    "type": "TabularTranslator",
    "mappings": [
      {
        "source": {
          "type": "String",
          "ordinal": "1"
        },
        "sink": {
          "name": "dateOfActivity",
          "type": "String"
        }
      },
      {
        "source": {
          "type": "String",
          "ordinal": "2"
        },
        "sink": {
          "name": "CampaignID",
          "type": "String"
        }
      }
    ]
  }
}
person andromedusa    schedule 09.09.2019
comment
Трудно сказать, задаете ли вы вопрос или предлагаете другой ответ :-) Если это ответ, вы можете перефразировать приведенное выше, чтобы его не приняли за вопрос и не удалили. В противном случае откройте новую ветку, см. Как задать вопрос. - person SOS; 09.09.2019
comment
Это было предложенное решение, которое избавит вас от необходимости определять динамическую схему в источнике. - person andromedusa; 10.09.2019