首页 > 解决方案 > 如何从 Azure 数据工厂中的 JSON 获取数组?

问题描述

我的实际(不正常工作)设置有两个管道:

  1. 获取 API 数据到湖:对于 SQL 中元数据表中的每一行调用 REST API 并将回复(json-files)复制到 Blob 数据湖。
  2. 将数据从湖复制到 SQL:对于每个文件,在 SQL 中自动创建表。

结果是 SQL 中正确的表数。只有表格的内容不是我所希望的。它们都包含 1 个名为 odata.metadata 的列和 1 个条目,即元数据的链接。如果我手动从数据湖中的 JSON 中删除元数据,然后运行第二个管道,SQL 表就是我想要的。

有:

{  "odata.metadata":"https://test.com", 
"value":[
{
  "Key":"12345",
"Title":"Name",
"Status":"Test"
}]}

想:

[{
"Key":"12345",
"Title":"Name",
"Status":"Test"
}]

我试图在 API 调用中添加 $.['value'] 。结果是没有 odata.metadata 行,但数组以 {value: 开头,这导致复制到 SQL 时出错

我还尝试使用映射(在接收器中)到 SQL。这为我手动指定映射的数据集提供了想要的结果,但仅适用于数组中具有相同列数的数据集。我不想手动为 170 个电话进行映射...

有谁知道如何在 ADF 中处理这个问题?目前我觉得唯一的解决方案是在管道中添加一个 Python 步骤,但我希望有一种标准的 ADF 方法来做到这一点!

标签: sqljsonrestazure-data-factory

解决方案


您可以使用扁平化格式化程序添加另一个带有数据流的管道,以在将数据复制到 SQL 之前从 JSON 文件中删除内容。

在展平 JSON 文件之前

这是我在将 JSON 数据复制到 SQL 数据库而不进行展平时看到的内容: 在此处输入图像描述

展平 JSON 文件后

向 JSON 文件添加了带有数据流的管道,以flatten从数组中删除“odata.metadata”内容。

源码预览在此处输入图像描述

展平格式化程序

从输入数组中选择所需的对象 在此处输入图像描述

从输入数组中选择对象后,您只能在 Flatten 格式化程序预览中看到 value 下的值。

在此处输入图像描述

水槽预览

在此处输入图像描述

展平后生成的文件。 在此处输入图像描述

将生成的文件复制为 SQL 的输入。

在此处输入图像描述

注意:如果您的输入文件架构不是恒定的,您可以启用Allow schema drift以允许架构更改

在此处输入图像描述

参考:映射数据流中的架构漂移


推荐阅读