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