sql - 如何从 Azure 数据工厂中的 JSON 获取数组?
问题描述
我的实际(不正常工作)设置有两个管道:
- 获取 API 数据到湖:对于 SQL 中元数据表中的每一行调用 REST API 并将回复(json-files)复制到 Blob 数据湖。
- 将数据从湖复制到 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 方法来做到这一点!
解决方案
您可以使用扁平化格式化程序添加另一个带有数据流的管道,以在将数据复制到 SQL 之前从 JSON 文件中删除内容。
在展平 JSON 文件之前:
这是我在将 JSON 数据复制到 SQL 数据库而不进行展平时看到的内容:
展平 JSON 文件后:
向 JSON 文件添加了带有数据流的管道,以flatten
从数组中删除“odata.metadata”内容。
展平格式化程序:
从输入数组中选择值对象后,您只能在 Flatten 格式化程序预览中看到 value 下的值。
水槽预览:
将生成的文件复制为 SQL 的输入。
注意:如果您的输入文件架构不是恒定的,您可以启用Allow schema drift
以允许架构更改
参考:映射数据流中的架构漂移
推荐阅读
- javascript - 区分javascript中url中的&冲突
- javascript - Firebase Firestore:如何在写入数据之前检查文档是否存在?
- swift - 三元运算符问题 SwiftUI
- php - 解析写得不好的 XLS
- flutter - 通过 workManager 安排本地通知
- r - 如何根据分位数按日期删除行?
- flutter - 无法将命名参数传递给颤振中的路由
- mongodb - MongoDB 返回与查询数组中的一个元素匹配的集合
- java - 使用 classrrom api 获取特定课程的老师
- javascript - 使用通知 API 时如何将 URL 添加到通知?