Синтаксический анализ JSON в Azure DataFactory

#azure #azure-data-factory #azure-data-factory-2

#azure #azure-data-factory #azure-data-factory-2

Вопрос:

Я хочу использовать фабрику данных Azure для вызова API, анализа некоторых данных json и сохранения их в базе данных sql Azure.

Не существует API, который возвращает все данные клиента за один раз, поэтому это может быть сделано только для одного клиента за раз. Это невозможно изменить. У меня есть клиентский API, который возвращает базовый список номеров клиентов, например:

 {
    "customerId": 100001,
    "customerId": 100002,
    "customerId": 100003,
    "customerId": 100004,
    "customerId": 100005,
    "customerId": 100006,
    "customerId": 100007,
}
 

Я использую соединение http api на фабрике данных для получения этого списка, затем использую цикл for each, чтобы просматривать их один за другим и запускать другой конвейер. Этот другой конвейер пойдет и получит данные клиента, которые выглядят следующим образом:

 {
  "customerId": 125488,
  "firstName": "John",
  "lastName": "Smith",
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021"
  },
  "phoneNumber": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "fax",
      "number": "646 555-4567"
    }
  ],
  "history": [
    {
      "description": "registered",
      "date": "2021-01-011T01:45:53.5736067Z"
    },
    {
      "description": "verificationRequired",
      "date": "2021-01-011T01:49:53.5736067Z"
    },
    {
      "description": "verified",
      "date": "2021-01-011T01:56:53.5736067Z"
    }
  ]
}
 

Моя цель — поместить customerid, firstname, lastname и age в таблицу customers, как показано ниже.

 create table customer (
    customerId int,
    firstName varchar(255),
    lastName varchar(255),
    age int
)
 

Эту часть я уже выполнил, используя копирование данных (api в sql). Моя следующая цель — поместить телефонные номера в таблицу телефонных номеров, как показано ниже.

 create table phonenumber (
    customerId int,
    phoneNumber varchar(255)
    phoneType varchar(255)
)
 

Я также хочу повторить это и для истории клиентов.

Я использую задачу копирования данных в конвейере для перемещения данных клиента в таблицу customer, но я не могу выполнять запись нескольких выходных данных в разные таблицы. Единственный способ, которым я могу это сделать, — это иметь три разных конвейера для трех разных таблиц, но это означает, что api вызывается три разных раза для одних и тех же данных. Должен быть лучший способ?

Ценю твою помощь, Амджид

Комментарии:

1. Привет @ jxlg4, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

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

Ответ №1:

Я думаю, вы можете создать хранимую процедуру для перемещения данных клиента в серверные таблицы.
Мой пример выглядит следующим образом

 SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

alter PROCEDURE [dbo].[uspCustomer] @json NVARCHAR(MAX)
AS  

BEGIN 
    INSERT INTO dbo.customer(customerId,firstName,lastName,age) 
        SELECT customerId,firstName,lastName,age 
        FROM OPENJSON(@json)
          WITH (
            customerId INT '$.customerId',
            firstName VARCHAR(255) '$.firstName',
            lastName VARCHAR(255) '$.lastName',
            age INT '$.age'
          );
    INSERT INTO dbo.phonenumber(customerId,phoneNumber,phoneType)
        SELECT customerId,phoneNumber,phoneType
        FROM OPENJSON(@json)
          WITH (
            customerId INT '$.customerId',
            phoneNumber VARCHAR(255) '$.phoneNumber[0].number',
            phoneType VARCHAR(255) '$.phoneNumber[0].type'
          );
    INSERT INTO dbo.phonenumber(customerId,phoneNumber,phoneType)
        SELECT customerId,phoneNumber,phoneType
        FROM OPENJSON(@json)
            WITH (
            customerId INT '$.customerId',
            phoneNumber VARCHAR(255) '$.phoneNumber[1].number',
            phoneType VARCHAR(255) '$.phoneNumber[1].type'
            );

END
 

Ниже приведен тест хранимой процедуры.

 DECLARE @json NVARCHAR(MAX);
SET @json = '{"customerId": 125488,"firstName": "John","lastName": "Smith","age": 25,"address": {"streetAddress": "21 2nd Street","city": "New York","state": "NY","postalCode": "10021"},"phoneNumber":[{"type": "home","number": "212 555-1234"},{"type": "fax","number": "646 555-4567"}]};'

exec [dbo].[uspCustomer] @json
 

Результат выглядит следующим образом:
введите описание изображения здесь

Я думаю, вы можете использовать действие хранимой процедуры для принятия этого объекта json.