【问题标题】:Azure Data Factory - traverse JSON array with multiple rowsAzure 数据工厂 - 遍历具有多行的 JSON 数组
【发布时间】:2021-11-04 20:12:37
【问题描述】:

我有一个 REST API,可以输出类似于此示例的 JSON 数据:

{
    "GroupIds": [
        "1234",
        "2345",
        "3456",
        "4567"
    ],
    "Id": "w5a19-a493-bfd4-0a0c8djc05",
    "Name": "Test Item",
    "Description": "test item description",
    "Notes": null,
    "ExternalId": null,
    "ExpiryDate": null,
    "ActiveStatus": 0,
    "TagIds": [
        "784083-4c77-b8fb-0135046c",
        "86de96-44c1-a497-0a308607",
        "7565aa-437f-af36-8f9306c9",
        "d5d841-1762-8c14-d8420da2",
        "bac054-2b6e-a19b-ef5b0b0c"
    ],
    "ResourceIds": []
}

使用 ADF,我想解析这个 JSON 对象,并为 GroupIds 数组中的每个值以及对象 IdName 插入一行...所以最终上述 JSON 应该转换为类似的表这个:

GroupID Id Name
1234 w5a19-a493-bfd4-0a0c8djc05 Test Item
2345 w5a19-a493-bfd4-0a0c8djc05 Test Item
3456 w5a19-a493-bfd4-0a0c8djc05 Test Item
4567 w5a19-a493-bfd4-0a0c8djc05 Test Item

我可以在复制活动设置中使用一些配置来完成此操作吗?

【问题讨论】:

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


    【解决方案1】:

    您可以使用Data flow 活动来获得所需的结果。

    首先添加 REST API 源,然后使用 select 转换器并添加所需的列。

    在此之后选择 Derived Column 转换器并使用 unfold 函数来展平 JSON 数组。

    另一种方法是使用Flatten 格式化程序。

    【讨论】:

      【解决方案2】:

      我倾向于为此使用更多的 ELT 模式,即将 JSON 传递给存储过程活动并让 SQL 数据库处理 JSON。这假设您已经可以访问一个非常支持 JSON 的 SQL 数据库。

      一个简化的例子:

      DECLARE @json NVARCHAR(MAX) = '{
          "GroupIds": [
              "1234",
              "2345",
              "3456",
              "4567"
          ],
          "Id": "w5a19-a493-bfd4-0a0c8djc05",
          "Name": "Test Item",
          "Description": "test item description",
          "Notes": null,
          "ExternalId": null,
          "ExpiryDate": null,
          "ActiveStatus": 0,
          "TagIds": [
              "784083-4c77-b8fb-0135046c",
              "86de96-44c1-a497-0a308607",
              "7565aa-437f-af36-8f9306c9",
              "d5d841-1762-8c14-d8420da2",
              "bac054-2b6e-a19b-ef5b0b0c"
          ],
          "ResourceIds": []
      }'
      
      SELECT
          g.[value] AS groupId,
          m.Id,
          m.[Name]
      FROM OPENJSON( @json, '$' )
      WITH
          (
          Id          VARCHAR(50) '$.Id',
          [Name]      VARCHAR(50) '$.Name',
          GroupIds    NVARCHAR(MAX) AS JSON
          ) m
          CROSS APPLY OPENJSON( @json, '$.GroupIds' ) g;
      

      您可以将其转换为以@json 为参数的存储过程,并将SELECT 转换为INSERT

      我的结果:

      我使用more screenprints here 完成了一个非常相似的示例,值得一看。这是使用映射数据流的不同模式,但如果您已经有可用的 SQL,那么使用它而不是使用重复成本启动单独的计算是有意义的。如果您没有登录到 SQL 数据库或没有访问权限,那么映射数据流方法可能对您有意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        相关资源
        最近更新 更多