【问题标题】:Parsing JSON in Azure DataFactory在 Azure 数据工厂中解析 JSON
【发布时间】:2021-02-25 16:13:10
【问题描述】:

我想用azure数据工厂调用一个api,解析一些json数据,然后保存到一个azure sql数据库中。

没有一次性返回所有客户数据的 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"
    }
  ]
}

我的目标是将客户 ID、名字、姓氏和年龄放入客户表中,如下所示。

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

这部分我已经使用复制数据(api to sql)完成了。我的下一个目标是将电话号码放入电话号码表中,如下所示。

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

我也想对客户历史重复这一点。

我在管道中使用复制数据任务将客户数据移动到客户表中,但我无法将多个输出写入不同的表。我能想到的唯一方法是为三个不同的表设置三个不同的管道,但这意味着为相同的数据调用 api 三个不同的时间。一定有更好的办法吗?

重视您的帮助 和平,阿姆吉德

【问题讨论】:

  • 嗨@jxlg4 如果您需要更多信息,请告诉我。
  • 嗨@jxlg4,如果我的回答对你有帮助,请接受(标记)它作为答案。这可能对其他社区成员有益。

标签: azure azure-data-factory azure-data-factory-2


【解决方案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 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2018-09-26
    • 2021-01-16
    • 2022-10-06
    相关资源
    最近更新 更多