操作说明:从 Azure Cosmos DB 查询 Microsoft Fabric 中的嵌套数据镜像数据库(预览)

使用 Microsoft Fabric 中的镜像数据库查询来自 Azure Cosmos DB for NoSQL 的嵌套 JSON 数据。

重要

Azure Cosmos DB 镜像目前处于预览阶段。 预览期间不支持生产工作负载。 目前,仅支持 Azure Cosmos DB for NoSQL 帐户。

先决条件

提示

在公共预览期间,建议使用现有 Azure Cosmos DB 数据的测试或开发副本,以便从备份中快速恢复。

在源数据库中创建嵌套数据

在 Azure Cosmos DB for NoSQL 帐户中创建 JSON 项,这些项包含不同级别的嵌套 JSON 数据。

  1. Azure 门户中,导航到你的 Azure Cosmos DB 帐户。

  2. 从资源菜单中选择“数据资源管理器”。

  3. 使用“+ 新建容器”新建一个容器。 在本指南中,将容器命名为 TestC。 相应的数据库名称是任意的。

  4. 多次使用“+ 新建项”选项创建并保存这五个 JSON 项。

    {
      "id": "123-abc-xyz",
      "name": "A 13",
      "country": "USA",
      "items": [
        {
          "purchased": "11/23/2022",
          "order_id": "3432-2333-2234-3434",
          "item_description": "item1"
        },
        {
          "purchased": "01/20/2023",
          "order_id": "3431-3454-1231-8080",
          "item_description": "item2"
        },
        {
          "purchased": "02/20/2023",
          "order_id": "2322-2435-4354-2324",
          "item_description": "item3"
        }
      ]
    }
    
    {
      "id": "343-abc-def",
      "name": "B 22",
      "country": "USA",
      "items": [
        {
          "purchased": "01/20/2023",
          "order_id": "2431-2322-1545-2322",
          "item_description": "book1"
        },
        {
          "purchased": "01/21/2023",
          "order_id": "3498-3433-2322-2320",
          "item_description": "book2"
        },
        {
          "purchased": "01/24/2023",
          "order_id": "9794-8858-7578-9899",
          "item_description": "book3"
        }
      ]
    }
    
    {
      "id": "232-abc-x43",
      "name": "C 13",
      "country": "USA",
      "items": [
        {
          "purchased": "04/03/2023",
          "order_id": "9982-2322-4545-3546",
          "item_description": "clothing1"
        },
        {
          "purchased": "05/20/2023",
          "order_id": "7989-9989-8688-3446",
          "item_description": "clothing2"
        },
        {
          "purchased": "05/27/2023",
          "order_id": "9898-2322-1134-2322",
          "item_description": "clothing3"
        }
      ]
    }
    
    {
      "id": "677-abc-yuu",
      "name": "D 78",
      "country": "USA"
    }
    
    {
      "id": "979-abc-dfd",
      "name": "E 45",
      "country": "USA"
    }
    

设置镜像和先决条件

为 Azure Cosmos DB for NoSQL 数据库配置镜像。 如果不确定如何配置镜像,请参阅配置镜像数据库教程

  1. 导航到 Fabric 门户

  2. 使用 Azure Cosmos DB 帐户的凭证创建新的连接和镜像数据库。

  3. 等待复制完成数据的初始快照。

查询基本嵌套数据

现在,使用 SQL 分析终结点创建可处理简单嵌套 JSON 数据的查询。

  1. 导航到 Fabric 门户中的镜像数据库。

  2. 镜像 Azure Cosmos DB 切换到 SQL 分析终结点

    选择器屏幕截图,其中显示了在 Fabric 门户中切换项。

  3. 打开测试表的上下文菜单,然后选择“新建 SQL 查询”。

  4. 运行此查询以使用 OPENJSON 扩展 items 数组。 此查询使用 OUTER APPLY 包含可能没有项数组的额外项。

    SELECT 
        t.name, 
        t.id, 
        t.country, 
        P.purchased, 
        P.order_id, 
        P.item_description 
    FROM OrdersDB_TestC AS t
    OUTER APPLY OPENJSON(t.items) WITH
    (
        purchased datetime '$.purchased',
        order_id varchar(100) '$.order_id',
        item_description varchar(200) '$.item_description'
    ) as P
    

    提示

    OPENJSON 中选择数据类型时,使用 varchar(max) 字符串类型可能会降低查询性能。 所以使用 varchar(n)n 可以是任意数字。 n 越低,查询性能就越高。

  5. 在下一个查询中使用 CROSS APPLY,以便仅显示含有 items 数组的项。

    SELECT
        t.name,
        t.id,
        t.country,
        P.purchased,
        P.order_id,
        P.item_description 
    FROM
        OrdersDB_TestC as t CROSS APPLY OPENJSON(t.items) WITH (
            purchased datetime '$.purchased',
            order_id varchar(100) '$.order_id',
            item_description varchar(200) '$.item_description' 
        ) as P 
    

创建深度嵌套数据

为基于此嵌套数据示例构建,我们将添加一个深度嵌套数据示例。

  1. Azure 门户中,导航到你的 Azure Cosmos DB 帐户。

  2. 从资源菜单中选择“数据资源管理器”。

  3. 使用“+ 新建容器”新建一个容器。 在本指南中,将容器命名为 TestD。 相应的数据库名称是任意的。

  4. 多次使用“+ 新建项”选项创建并保存此 JSON 项。

    {
      "id": "eadca09b-e618-4090-a25d-b424a26c2361",
      "entityType": "Package",
      "packages": [
        {
          "packageid": "fiwewsb-f342-jofd-a231-c2321",
          "storageTemperature": "69",
          "highValue": true,
          "items": [
            {
              "id": "1",
              "name": "Item1",
              "properties": {
                "weight": "2",
                "isFragile": "no"
              }
            },
            {
              "id": "2",
              "name": "Item2",
              "properties": {
                "weight": "4",
                "isFragile": "yes"
              }
            }
          ]
        },
        {
          "packageid": "d24343-dfdw-retd-x414-f34345",
          "storageTemperature": "78",
          "highValue": false,
          "items": [
            {
              "id": "3",
              "name": "Item3",
              "properties": {
                "weight": "12",
                "isFragile": "no"
              }
            },
            {
              "id": "4",
              "name": "Item4",
              "properties": {
                "weight": "12",
                "isFragile": "no"
              }
            }
          ]
        }
      ],
      "consignment": {
        "consignmentId": "ae21ebc2-8cfc-4566-bf07-b71cdfb37fb2",
        "customer": "Humongous Insurance",
        "deliveryDueDate": "2020-11-08T23:38:50.875258Z"
      }
    }
    

查询深度嵌套数据

最后,创建一个 T-SQL 查询,查找嵌套在 JSON 字符串中的数据。

  1. 打开 TestD 表的上下文菜单,然后再次选择“新建 SQL 查询”。

  2. 运行此查询,使用包含委托的 OUTER APPLY 扩展所有级别的嵌套数据。

    SELECT
        P.id,
        R.packageId,
        R.storageTemperature,
        R.highValue,
        G.id,
        G.name,
        H.weight,
        H.isFragile,
        Q.consignmentId,
        Q.customer,
        Q.deliveryDueDate 
    FROM
        OrdersDB_TestD as P CROSS APPLY OPENJSON(P.packages) WITH ( packageId varchar(100) '$.packageid',
        storageTemperature INT '$.storageTemperature',
        highValue varchar(100) '$.highValue',
        items nvarchar(MAX) AS JSON ) as R 
    OUTER APPLY OPENJSON (R.items) WITH (
        id varchar(100) '$.id',
        name varchar(100) '$.name',
        properties nvarchar(MAX) as JSON 
    ) as G OUTER APPLY OPENJSON(G.properties) WITH  (
        weight INT '$.weight',
        isFragile varchar(100) '$.isFragile'
    ) as H OUTER APPLY OPENJSON(P.consignment) WITH  (
        consignmentId varchar(200) '$.consignmentId',
        customer varchar(100) '$.customer',
        deliveryDueDate Date '$.deliveryDueDate'
    ) as Q 
    

    注意

    扩展 packages 时,items 表示为 JSON,可以有选择地扩展。 items 属性具有 JSOn 等子属性,也可以有选择地扩展。

  3. 最后,运行查询,选择何时扩展特定级别的嵌套。

    SELECT
        P.id,
        R.packageId,
        R.storageTemperature,
        R.highValue,
        R.items,
        Q.consignmentId,
        Q.customer,
        Q.deliveryDueDate 
    FROM
        OrdersDB_TestD as P CROSS APPLY OPENJSON(P.packages) WITH (
            packageId varchar(100) '$.packageid',
            storageTemperature INT '$.storageTemperature',
            highValue varchar(100) '$.highValue',
            items nvarchar(MAX) AS JSON
        ) as R 
    OUTER APPLY OPENJSON(P.consignment) WITH  (
        consignmentId varchar(200) '$.consignmentId',
        customer varchar(100) '$.customer',
        deliveryDueDate Date '$.deliveryDueDate'
    ) as Q 
    

    注意

    在此 T-SQL 查询体验中,不强制实施嵌套级别的属性限制。