Azure 数据工厂复杂 JSON 源(嵌套数组)到 Azure Sql 数据库?

2024-02-17

我有一个 JSON 源文档,将定期上传到 Azure blob 存储。客户希望使用 Azure 数据工厂将此输入写入 Azure Sql 数据库。然而,JSON 很复杂,有许多嵌套数组,到目前为止我还没有找到一种方法来扁平化文档。也许这不受支持/不可能?

[
{
"ActivityId": 1,
    "Header": {},
    "Body": [{
        "1stSubArray": [{
            "Id": 456,
            "2ndSubArray": [{
                "Id": "abc",
                "Descript": "text",
                "3rdSubArray": [{
                    "Id": "def",
                    "morefields": "text"
                },
                {
                    "Id": "ghi",
                    "morefields": "sample"
                }]
            }]
        }]
    }]
}
]

我需要将其压平:

ActivityId, Id, Id, Descript, Id, morefields
1, 456, abc, text1, def, text
1, 456, abc, text2, ghi, sample
1, 456, xyz, text3, jkl, textother
1, 456, xyz, text4, mno, moretext 

每个 ActivityId 可能有 8 个以上的平面记录。有人看到过这种情况并找到了使用 Azure 数据工厂复制数据解决问题的方法吗?


Azure SQL 数据库具有一些强大的 JSON 粉碎功能,包括OPENJSON https://learn.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql?view=sql-server-ver15它分解 JSON,并且JSON_VALUE https://learn.microsoft.com/en-us/sql/t-sql/functions/json-value-transact-sql?view=sql-server-ver15它从 JSON 返回标量值。由于您的体系结构中已经有 Azure SQL DB,因此使用它比添加其他组件更有意义。

那么,为什么不采用 ELT 模式,使用数据工厂将 JSON 插入到 Azure SQL DB 中的表中,然后调用存储过程任务来分解它呢?一些基于您的示例的示例 SQL:

DECLARE @json NVARCHAR(MAX) = '[
{
  "ActivityId": 1,
  "Header": {},
  "Body": [
    {
      "1stSubArray": [
        {
          "Id": 456,
          "2ndSubArray": [
            {
              "Id": "abc",
              "Descript": "text",
              "3rdSubArray": [
                {
                  "Id": "def",
                  "morefields": "text"
                },
                {
                  "Id": "ghi",
                  "morefields": "sample"
                }
              ]
            },
            {
              "Id": "xyz",
              "Descript": "text",
              "3rdSubArray": [
                {
                  "Id": "jkl",
                  "morefields": "textother"
                },
                {
                  "Id": "mno",
                  "morefields": "moretext"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}
]'

--SELECT @json j

-- INSERT INTO yourTable ( ...
SELECT
    JSON_VALUE ( j.[value], '$.ActivityId' ) AS ActivityId,
    JSON_VALUE ( a1.[value], '$.Id' ) AS Id1,
    JSON_VALUE ( a2.[value], '$.Id' ) AS Id2,
    JSON_VALUE ( a2.[value], '$.Descript' ) AS Descript,
    JSON_VALUE ( a3.[value], '$.Id' ) AS Id3,
    JSON_VALUE ( a3.[value], '$.morefields' ) AS morefields

FROM OPENJSON( @json ) j
    CROSS APPLY OPENJSON ( j.[value], '$."Body"' ) AS m
        CROSS APPLY OPENJSON ( m.[value], '$."1stSubArray"' ) AS a1
            CROSS APPLY OPENJSON ( a1.[value], '$."2ndSubArray"' ) AS a2
                CROSS APPLY OPENJSON ( a2.[value], '$."3rdSubArray"' ) AS a3;

正如你所看到的,我用过CROSS APPLY导航多个级别。我的结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Azure 数据工厂复杂 JSON 源(嵌套数组)到 Azure Sql 数据库? 的相关文章

随机推荐

  • Magento 按小数排序属性而不是按字母数字排序

    所以我疯狂地在谷歌上搜索 试图找到一个解决这个问题的方法 该方法实际上可以正常工作 但却空手而归 使用类别页面上的 排序依据 功能按属性 容量 重量等 对产品进行排序时 Magento 像这样排序 因为它认为数字是文本字符串 产品A 10公
  • 无法让 EclipseLink MOXy 工作

    我是 JAXB 新手 我想使用 EclipseLink MOXy 更改默认名称空间前缀 我的 package info java 有以下代码行 javax xml bind annotation XmlSchema namespace ht
  • Chrome自动设置输入格式=数字

    我有一个 Web 应用程序 我使用 HTML5 属性 type number 将输入字段指定为数字
  • 如何将主干视图连接到流星车把模板?

    看起来像 Backbone view meteor 和 handbars 在操作 DOM 的一部分时具有重叠功能 我查看了 ToDo 应用程序 它应该使用 Backbone 但实际上 他们只使用路由器 主干视图也处理模板 但它们听起来与流星
  • 有没有办法限制“git gc”使用的内存量?

    我在共享主机上托管 git 存储库 我的存储库中必然有几个非常大的文件 每次我尝试在存储库上运行 git gc 时 我的进程都会因使用过多内存而被共享托管提供商杀死 有没有办法限制 git gc 可以消耗的内存量 我希望它可以用内存使用来换
  • VB6下载网页源码

    VB6 有没有办法将网页源下载到字符串或文本框 例如 在 VB Net 中 WebClient 类允许您使用 DownloadString google com 执行此操作 我如何在 vb6 中执行相同操作 注意 我想避免使用网络浏览器 我
  • WPF 应用程序的异常报告

    在未处理的异常期间 是否有某种方法可以捕获输出并在应用程序崩溃时显示错误报告对话框 我的想法是在后台运行一个小程序 它唯一的工作就是监听主应用程序的异常退出 然后显示 报告 对话框 用户可以选择通过电子邮件向我发送错误的输出 不太确定如何实
  • 确保给定的 docker 容器正在运行

    我现在在很多服务器上使用 docker 但有时我使用的一些容器由于负载过重而崩溃 我正在考虑添加一个 cron 来检查容器的每一分钟是否正在运行 但我没有找到任何令人满意的方法 我使用 cidfile 启动容器 该文件保存正在运行的容器的
  • 如何恢复netbeans中修改过的文件?

    我正在从事一个重要的项目 我修改了一些 php 和 css 文件并上传主题 然后 我删除了缓存 该项目不起作用 我想在第一次修改时恢复文件 有办法吗 请原谅我的英语 您没有说明您正在使用哪个版本的 Netbeans 但如果它是最新版本 您可
  • Visual Studio 2010 - 卸载 NuGet

    如何从 Visual Studio 2010 中卸载 NuGet 我尝试使用 以管理员身份运行 打开 Visual Studio 2010 但 卸载 选项不可用于从 VS2010 卸载 NuGet 扩展 通常要在VS2010中卸载NuGet
  • 解析模块说明符“vue”时出错。相对模块说明符必须以“./”、“../”或“/”开头

    我正在尝试使用代码让基本的 VueJS 应用程序运行 div div
  • 如何添加 Visual Studio 2013 Scaffolding 中使用的新 Scaffold?

    有没有办法添加新的脚手架或覆盖新的 Visual Studio 2013 脚手架中使用的脚手架功能 我在互联网上能找到的唯一文档是如何使用 CodeTemplates 文件夹覆盖 T4 模板 我想在添加 gt 新脚手架项 时向列表添加一个新
  • 如何区分方向键运动和操纵杆运动?

    我需要有两种不同的行为 一种用于方向键 另一种用于模拟操纵杆 在同一个游戏板上 问题是在onGenericMotionEvent回调 两者都有相同的信息MotionEvent我无法区分它们 d pad MotionEvent action
  • 如何以编程方式 (C#) 从 POP3 邮件中获取附件?

    是否有任何 C API 可以完成此任务 有什么建议么 我用过 n 软件 http www nsoftware com ipworks 过去取得了成功 不是免费的 但是嘿 如果它不起作用 你就可以责怪别人 换句话说 你得到公司的技术支持 他们
  • 配置Google App Engine应用程序以进行跨域

    您能否建议我们如何配置托管在 Google App Engine 上的 Python 应用程序以接受从浏览器完成的 AJAX 选项 GET POST PUT 和 DELETE 此类调用的具体细节是 XmlHTTPRequest 首先向服务器
  • 如何在 subscribe Angular 4 中返回值

    我是角度观察的新手 我有一个问题 我想在订阅方法中返回一个值 我有 以下方法 getFirebaseData idForm string observable
  • 如何将图像保存到SD卡上按钮单击android [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 1 XML 中使用 Image
  • Laravel 属于ToMany 具有多列的数据透视表

    目前 我在数据库中有两个表和一个数据透视表 当我需要进行 belongsToMany 查找时 可以将它们连接起来 基本示例是一个数据库表是 teams 另一个数据库表是 members 我可以在团队和成员模型上使用belongsToMany
  • 扩展 WPF 按钮以将数据存储在新属性中

    我想扩展一个 WPF 按钮来存储一些额外的数据 类似于当前的 Tag 属性 附加属性是前进的方向吗 我想要存储的数据将是一个 URL 链接字符串 例如我希望能够执行以下操作
  • Azure 数据工厂复杂 JSON 源(嵌套数组)到 Azure Sql 数据库?

    我有一个 JSON 源文档 将定期上传到 Azure blob 存储 客户希望使用 Azure 数据工厂将此输入写入 Azure Sql 数据库 然而 JSON 很复杂 有许多嵌套数组 到目前为止我还没有找到一种方法来扁平化文档 也许这不受