我正在使用 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。
复制活动高级编辑器和集合引用仅支持对象数组。
您的数组是一个没有任何对象的简单数组。因此,复制活动不支持这种数组。
但是,在这种情况下,您可以尝试以下解决方法。但这涉及复杂且耗时的操作,例如循环和 SQL 脚本,并且仅当 JSON 行少于 5000 时才有效。Dataflow 是比这更好的选择。
首先将您的 API 提供给 Web 活动并从中获取所需的 JSON。将 Web 活动输出中的
product_ids
数组提供给 For-Each 活动,并选中顺序复选框。
在这里,我使用查找来获取 JSON 并从查找输出中给出
product_ids
数组。
在管道的变量部分创建一个数组变量。
在 for-each 活动中,将附加变量活动添加到创建的数组变量中,并给出以下表达式。
@json(concat(split(string(activity('Lookup1').output.value[0]),'"product_ids":')[0],'"product_id":',item(),'}'))
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 表并调试管道。它会给你预期的结果,如下所示。