#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.