Чтение JSON из остального API как есть с фабрикой данных Azure

Я пытаюсь заставить фабрику данных Azure прочитать мой REST API и поместить его в SQL Server. Источником является REST API, а приемником - таблица SQL Server.

Я пробовал сделать что-то вроде:

"translator": {
    "type": "TabularTranslator",
    "schemaMapping": {
        "$": "json"
    },
    "collectionReference": "$.tickets"
}

Исходник выглядит так:

{ "tickets": [ {... }, {...} ] }

Я выбираю этот путь из-за плохих картографических возможностей. Затем я разделю данные с помощью запроса. Предпочтительно я хотел бы хранить каждый объект внутри билетов в виде строки с JSON этого объекта.

Короче говоря, как я могу получить вывод JSON из RestSource в столбец SqlSink с одним столбцом text / nvarchar (max)?


person ferdyh    schedule 19.03.2019    source источник
comment
Я просто сохраняю весь документ в поле VARCHAR (MAX), а затем использую функции JSON внутри T-SQL, чтобы уничтожить его. Какая у вас настоящая проблема?   -  person Nick.McDermaid    schedule 19.03.2019
comment
Как мне получить фактический json в поле VARCHAR (MAX)? DF пытается разобрать его.   -  person ferdyh    schedule 19.03.2019
comment
Прежде чем мы перейдем к VARCHAR (MAX), в чем проблема? Ошибка или неверные данные? TBH. Я когда-либо делал это только через Stream Analytics. У меня нет доступа к ADF для воспроизведения прямо сейчас, но один из способов сделать это - использовать задачу веб-активности, вызвать API и использовать вывод для вставки в таблицу ... теоретически   -  person Nick.McDermaid    schedule 20.03.2019
comment
Что ж, мы пытаемся передать данные на SQL-сервер без предоставления статической схемы. Это связано с тем, что группа загрузки данных отличается от группы, которая использует данные. Когда вы оставляете сопоставление схемы пустым, ADF пытается сопоставить его автоматически, что работает для плоского JSON, где у вас есть ключи только на первом уровне. Когда вы переходите к вложенным объектам или массивам, он их игнорирует. Поэтому моим решением было бы поместить весь json в один столбец и запросить его оттуда.   -  person ferdyh    schedule 20.03.2019
comment
В SQL создайте хранимую процедуру, которая принимает параметр VARCHAR (MAX) и вставляет его в вашу таблицу. В ADF перетащите веб-задачу. Поместите в него свой REST-вызов и проверьте. Теперь добавьте задачу хранимой процедуры и вызовите сохраненную процедуру. Импортируйте параметр. В поле «Значение» установите динамическое содержимое и введите это @string(activity('Call REST').output) (где Call REST - это имя вашей веб-задачи). Это вызовет API один раз и вставит его. Если вам нужно делать это неоднократно, вам нужно будет объяснить дальше. Если это сработает, вы можете написать это в качестве ответа (или я буду)   -  person Nick.McDermaid    schedule 20.03.2019
comment
Что ж, я могу это проверить, и это, вероятно, сработает, однако тогда я не могу использовать поддержку пагинации RestSource. Для меня было бы лучше, если бы у действия CopyData была возможность каким-то образом скопировать собственный json как есть.   -  person ferdyh    schedule 20.03.2019
comment
Это подсказка: docs.microsoft.com/en-us/azure/data-factory/ Вы можете использовать этот соединитель REST для экспорта ответа JSON REST API «как есть» в различные файловые хранилища. Чтобы добиться такого независимого от схемы копирования, пропустите раздел структуры (также называемый схемой) в наборе данных и сопоставление схемы в операции копирования.   -  person Nick.McDermaid    schedule 20.03.2019
comment
SQL Server - это не файловое хранилище; Кажется, это работает, если вы сначала сохраняете данные в хранилище больших двоичных объектов, затем извлекаете структуру с действием «Получить метаданные» и затем сохраняете ее на сервере sql.   -  person ferdyh    schedule 21.03.2019
comment
Основная идея заключалась в том, что ссылка подразумевала, что вы можете рассматривать JSON как просто большую строку, не зависящую от плоской схемы. (а затем я предполагаю, что напишу это в базе данных)   -  person Nick.McDermaid    schedule 21.03.2019
comment
Да, это тоже было мое предположение, но это, похоже, не работает, если вы пишете в нефайловое хранилище, такое как SQL Server. Затем он всегда пытается интерпретировать схему и не может сохранить весь json в nvarchar (max), varchar (max) или текстовом поле.   -  person ferdyh    schedule 21.03.2019
comment
О, я вижу. Раздражающий.   -  person Nick.McDermaid    schedule 21.03.2019


Ответы (1)


Мне удалось решить ту же проблему, изменив отображение вручную. ADF все равно пытается проанализировать json, но в расширенном режиме вы можете редактировать пути json. Например, это исходная схема, автоматически анализируемая ADF https://imgur.com/Y7QhcDI После открытия в В расширенном режиме он будет показывать полные пути, добавляя индексы элементов, что-то похожее на $ ticket [0] [] и т.д. $ value https://i.stack.imgur.com/WnAzC.jpg. В результате весь json будет записан в столбец назначения.

Если есть правила разбивки на страницы, каждая страница будет записана как одна строка.

person maty    schedule 15.04.2020