在Azure数据工厂中处理大型JSON

时间:2020-02-18 14:32:08

标签: json azure azure-storage-blobs azure-data-factory azure-blob-storage

我正在尝试在以下情况下使用ADF:

  • 将JSON上载到Azure存储Blob,其中包含一系列相似的对象
  • ADF通过查找活动读取此JSON,并通过Web活动将其上传到外部接收器

我不能使用复制活动,因为我需要为Web活动创建一个JSON有效负载,因此我必须查找数组并像这样粘贴它(Web活动的有效载荷):

{
   "some field": "value",
   "some more fields": "value",
   ...
   "items": @{activity('GetJsonLookupActivity').output.value}
}

“查找”活动的已知限制为一次最多5000行的上限。如果JSON较大,则只会读取5000个顶部行,而所有其他行都将被忽略。

我知道这一点,所以我有一个系统,可以将有效负载分成5000行,然后再上传到存储中。但是我不是唯一的用户,因此存在一个真正的担忧,即其他人将尝试上载更大的文件,并且管道将以部分上载的方式静默通过,而用户显然希望所有行都将上载。

我想出了两种解决方法,但我看不到如何实现:

  1. 我是否可以通过任何方法检查JSON文件是否太大,如果失败,则管道失败?查找活动似乎不允许行计数,并且“获取元数据”活动仅返回字节大小。

  2. 或者,MSDN docs提出了一种在foreach循环中复制数据的解决方法。但是我无法弄清楚如何使用Lookup首先从JSON获取行1-5000,然后行5001-10000等。使用OFFSET N FETCH NEXT 5000 ROWS ONLY使用SQL很容易,但是如何使用JSON做到这一点?

1 个答案:

答案 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活动。所有操作都可以在分支中进行划分。