Azure Комплекс фабрики данных JSON источник (вложенные массивы) в Azure Sql База данных? - PullRequest
2 голосов
/ 03 февраля 2020

У меня есть JSON исходный документ, который будет регулярно загружаться в Azure хранилище BLOB-объектов. Клиент хочет, чтобы этот ввод был записан в Azure Sql База данных с использованием Azure Фабрика данных. Однако JSON сложен со многими вложенными массивами, и до сих пор я не смог найти способ сгладить документ. Возможно, это не поддерживается / возможно?

[
{
"ActivityId": 1,
    "Header": {},
    "Body": [{
        "1stSubArray": [{
            "Id": 456,
            "2ndSubArray": [{
                "Id": "abc",
                "Descript": "text",
                "3rdSubArray": [{
                    "Id": "def",
                    "morefields": "text"
                },
                {
                    "Id": "ghi",
                    "morefields": "sample"
                }]
            }]
        }]
    }]
}
]

Мне нужно сгладить это:

ActivityId, Id, Id, Descript, Id, morefields
1, 456, abc, text1, def, text
1, 456, abc, text2, ghi, sample
1, 456, xyz, text3, jkl, textother
1, 456, xyz, text4, mno, moretext 

Может быть 8+ плоских записей на ActivityId. Кто-нибудь, кто видел это и нашел способ решить, используя Azure Data Factory Copy Data?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Azure SQL База данных имеет несколько способностей JSON измельчения, включая OPEN JSON, которая измельчает JSON, и JSON_VALUE , которая возвращает скалярные значения из JSON. Поскольку у вас уже есть Azure SQL БД в вашей архитектуре, имеет смысл использовать ее, а не добавлять дополнительные компоненты.

Так почему бы не принять шаблон ELT, где вы используете фабрику данных для вставки JSON в таблицу в Azure SQL БД, а затем вызвать задачу хранимой процедуры, чтобы уничтожить ее? Пример SQL на основе вашего примера:

DECLARE @json NVARCHAR(MAX) = '[
{
  "ActivityId": 1,
  "Header": {},
  "Body": [
    {
      "1stSubArray": [
        {
          "Id": 456,
          "2ndSubArray": [
            {
              "Id": "abc",
              "Descript": "text",
              "3rdSubArray": [
                {
                  "Id": "def",
                  "morefields": "text"
                },
                {
                  "Id": "ghi",
                  "morefields": "sample"
                }
              ]
            },
            {
              "Id": "xyz",
              "Descript": "text",
              "3rdSubArray": [
                {
                  "Id": "jkl",
                  "morefields": "textother"
                },
                {
                  "Id": "mno",
                  "morefields": "moretext"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}
]'

--SELECT @json j

-- INSERT INTO yourTable ( ...
SELECT
    JSON_VALUE ( j.[value], '$.ActivityId' ) AS ActivityId,
    JSON_VALUE ( a1.[value], '$.Id' ) AS Id1,
    JSON_VALUE ( a2.[value], '$.Id' ) AS Id2,
    JSON_VALUE ( a2.[value], '$.Descript' ) AS Descript,
    JSON_VALUE ( a3.[value], '$.Id' ) AS Id3,
    JSON_VALUE ( a3.[value], '$.morefields' ) AS morefields

FROM OPENJSON( @json ) j
    CROSS APPLY OPENJSON ( j.[value], '$."Body"' ) AS m
        CROSS APPLY OPENJSON ( m.[value], '$."1stSubArray"' ) AS a1
            CROSS APPLY OPENJSON ( a1.[value], '$."2ndSubArray"' ) AS a2
                CROSS APPLY OPENJSON ( a2.[value], '$."3rdSubArray"' ) AS a3;

Как видите, я использовал CROSS APPLY для навигации по нескольким уровням. Мои результаты:

My results

0 голосов
/ 06 февраля 2020

В прошлом вы могли следить за этим блогом и моим предыдущим случаем: Потеря данных от источника к приемнику при копировании данных для установки опции Cross-apply nested JSON array в наборе данных хранилища BLOB-объектов. Однако теперь оно исчезает.

Вместо этого Ссылка на коллекцию применяется для сопоставления схемы элементов массива в операции копирования.

enter image description here

Но, исходя из моего теста, только один массив может быть сведен в схему. Можно ссылаться на несколько массивов - они возвращаются как одна строка, содержащая все элементы в массиве. Однако только один массив может иметь каждый из его элементов, возвращаемых как отдельные строки. Это текущее ограничение для jsonPath settings.

enter image description here

В качестве обходного пути вы можете сначала преобразовать файл json с вложенными объектами в файл CSV с помощью Logi c Приложение, а затем вы можете использовать файл CSV в качестве ввода для Azure Фабрика данных. Пожалуйста, обратитесь к этому do c, чтобы понять, как приложение Logi c может использоваться для преобразования вложенных объектов из файла json в CSV. Конечно, вы могли бы также приложить некоторые усилия на стороне базы данных sql, такой как SP, которая упоминается в комментарии @ GregGalloway.


Просто для краткости, к сожалению, только "Ссылка на коллекцию" работает на один уровень ниже в структуре массива, что не подходит для @Emrikol. Finally,@Emrikol забросил Data Factory и создал приложение для работы.

...