【问题标题】:Handling big JSONs in Azure Data Factory在 Azure 数据工厂中处理大型 JSON
【发布时间】:2020-06-02 14:40:40
【问题描述】:

我正在尝试将 ADF 用于以下场景:

  • 将 JSON 上传到 Azure 存储 Blob,其中包含一组类似对象
  • 此 JSON 由 ADF 使用 Lookup Activity 读取并通过 Web Activity 上传到外部接收器

我不能使用 Copy Activity,因为我需要为 Web Activity 创建一个 JSON 负载,所以我必须查找数组并像这样粘贴它(Web Activity 的负载):

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

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

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

我想出了两个解决方法的概念,但我不知道如何实现:

  1. 我有什么方法可以检查 JSON 文件是否太大,如果是,则使管道失败? Lookup Activity 似乎不允许行计数,Get Metadata Activity 仅返回以字节为单位的大小。

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

【问题讨论】:

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


    【解决方案1】:

    当您使用 LookUp Activity 时,您不能设置任何索引范围(1-5,000,5,000-10,000)。在我看来,doc 中提到的解决方法并不意味着您可以使用带有分页功能的 LookUp Activity。

    我的解决方法是在数据传输之前编写一个azure函数来获取json数组的总长度。在azure函数内部,将数据分成不同的子临时文件,分页如sub1.json,sub2.json...。然后输出一个包含文件名的数组。

    用 ForEach Activity 抓取数组,在循环中执行查找活动。文件路径可以设置为动态值。然后进行下一个Web Activity。

    当然,我的想法可以改进。例如,你得到 json 数组的总长度并且它在 5000 限制下,你可以返回{"NeedIterate":false}。通过IfCondition Activity 评估该响应来决定应该采用哪种方式是next。如果值为false,直接执行LookUp活动。都可以在分支中划分。

    【讨论】:

    • 所以你的回答是我不能纯粹在 ADF 中做到这一点,我需要一个 Azure 函数?
    • @V0ldek 抱歉回复晚了。是的,我就是这个意思。
    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2021-09-27
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2020-04-26
    相关资源
    最近更新 更多