我正在尝试将ADF用于以下场景:
- JSON被上传到Azure存储Blob,其中包含一组类似的对象
- 该JSON由ADF通过查找活动读取,并通过Web活动上传到外部接收器
我不能使用复制活动,因为我需要为Web活动创建一个JSON负载,所以我必须查找数组并像这样粘贴它(Web活动的负载(:
{
"some field": "value",
"some more fields": "value",
...
"items": @{activity('GetJsonLookupActivity').output.value}
}
"查找"活动有一个已知的限制,即一次上限为5000行。如果JSON较大,则只读取顶部的5000行,而忽略其他所有行。
我知道这一点,所以我有一个系统,在上传到存储之前,可以将有效载荷分割成5000行的块。但我不是唯一的用户,因此有一个合理的担忧,即其他人会尝试上传更大的文件,管道将以部分上传的方式静默通过,而用户显然希望所有行都能上传。
我已经提出了两个解决方法的概念,但我不知道如何实现这两个概念:
我有没有办法检查JSON文件是否太大,如果是的话,会使管道失败?Lookup Activity似乎不允许行计数,而Get Metadata Activity只返回以字节为单位的大小。
或者,MSDN文档提出了一种在foreach循环中复制数据的变通方法。但我不知道如何使用Lookup从JSON中首先获取1-5000行,然后再获取5001-10000行等等。使用
OFFSET N FETCH NEXT 5000 ROWS ONLY
的SQL很容易,但是如何使用JSON呢?
使用LookUp Activity时不能设置任何索引范围(1-5,000,5,000-10,000
(。在我看来,文档中提到的解决方法并不意味着可以使用带有分页的LookUp Activity。
我的解决方法是编写一个azure函数,在数据传输之前获取json数组的总长度。在azure函数中,将数据划分为不同的子临时文件,使用类似sub1.json,sub2.json...
的分页。然后输出一个包含文件名的数组。
使用ForEach Activity获取数组,在循环中执行查找活动。文件路径可以设置为动态值。然后进行下一个Web活动。
当然,我的想法可以改进。例如,如果您得到json数组的总长度,并且它不超过5000的限制,您可以只返回{"NeedIterate":false}
。通过IfCondition
活动评估该响应,以决定下一步应该采用哪种方式。如果值为false,则直接执行LookUp活动。所有的都可以在分支中进行划分。