如何:从 Azure Cosmos DB 查询 Microsoft Fabric 镜像数据库中的嵌套数据(预览版)

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

重要

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

先决条件

小窍门

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

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

在包含不同级别的嵌套 JSON 数据的 Azure Cosmos DB for NoSQL 帐户中创建 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-3 进行操作。 使用同一数据集,我们可以创建查询来平展数据,而无需显式定义架构。

  1. 运行此查询以扩展数组 itemsOPENJSON 而无需定义模式。 这通过将每个嵌套对象分隔为一个新行来平展项数组一个级别。

    SELECT
        t.name,
        t.id,
        t.country,
        p.*
    FROM OrdersDB_TestC as t 
    CROSS APPLY OPENJSON(t.items) p
    
  2. 运行此查询以在无需定义架构的情况下,使用OPENJSON进一步扩展items数组。 这通过将每个嵌套对象中的每个属性分隔为一个新行来平展项数组两个级别。

    SELECT
        t.name,
        t.id,
        t.country,
        q.*
    FROM OrdersDB_TestC as t 
    CROSS APPLY OPENJSON(t.items) q
    OUTER APPLY OPENJSON(t.items) 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 查询体验中,不会强制实施嵌套级别的属性限制。