如何在 ADF 中使用集合引用交叉应用简单数组?

问题描述 投票:0回答:1

我正在使用 Azure 数据工厂从 JSON REST API 提取数据。 JSON 元素的格式如下:

{
    "order_id": 1
    "date": "20170122",
    "product_ids": [123, 124, 125]
}

我想将此数据存储为 SQL 表中的 3 行,每一行对应 Product_ids 数组中的每个元素。我的预期输出如下所示:

  order_id     date     product_id  
 ========== ========== ============ 
         1   20170122          123  
         1   20170122          124  
         1   20170122          125 

我知道我可以通过数据流来做到这一点,但理想情况下我想通过简单的复制数据活动来处理它。但是,我不太清楚如何让它发挥作用。

我已经看过有关集合引用的文档,但我能找到的所有示例都使用带有命名元素的更复杂的数组,例如:

{
    "order_id": 1
    "date": "20170122",
    "products": [
        {
            "prod": "p1",
            "price": 23
        },
        {
            "prod": "p2",
            "price": 13
        }
    ]
}

对于这种更复杂的情况,您可以将集合引用设置为

$['products']
,然后提取
['prod']
['price']
。同样,我使用
$['product_ids']
作为集合参考。但是使用什么来进行映射呢?使用
[0]
,我只得到一行,product_id 为 123。如果我使用
[*]
,我得到一行,product_id 列中包含 NULL。

json azure azure-data-factory
1个回答
0
投票

复制活动高级编辑器和集合引用仅支持对象数组。

enter image description here

您的数组是一个没有任何对象的简单数组。因此,复制活动不支持这种数组。

但是,在这种情况下,您可以尝试以下解决方法。但这涉及复杂且耗时的操作,例如循环和 SQL 脚本,并且仅当 JSON 行少于 5000 时才有效。Dataflow 是比这更好的选择

首先将您的 API 提供给 Web 活动并从中获取所需的 JSON。将 Web 活动输出中的

product_ids
数组提供给 For-Each 活动,并选中顺序复选框。

在这里,我使用查找来获取 JSON 并从查找输出中给出

product_ids
数组。

enter image description here

在管道的变量部分创建一个数组变量。

在 for-each 活动中,将附加变量活动添加到创建的数组变量中,并给出以下表达式。

@json(concat(split(string(activity('Lookup1').output.value[0]),'"product_ids":')[0],'"product_id":',item(),'}'))

enter image description here

for循环后,它将生成如下所示的JSON数组。

[
        {
            "order_id": 1,
            "date": "20170122",
            "product_id": 123
        },
        {
            "order_id": 1,
            "date": "20170122",
            "product_id": 124
        },
        {
            "order_id": 1,
            "date": "20170122",
            "product_id": 125
        }
]

接下来,进行复制活动并在源中,在查询选项中使用带有以下脚本的 SQL 数据集。

DECLARE @json NVARCHAR(max) = N'@{variables('myjson')}';

SELECT * FROM  
 OPENJSON (@json)  
WITH (   
              order_id int '$.order_id' ,  
              date varchar(32) '$.date',  
              product_id int '$.product_id'
 );

在复制活动接收器中,提供目标 SQL 表并调试管道。它会给你预期的结果,如下所示。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.