使用 Microsoft Fabric 中的镜像数据库查询从 Azure Cosmos DB for NoSQL 获取的嵌套 JSON 数据。
重要
Azure Cosmos DB 的镜像目前处于 预览版。 预览期间不支持生产工作负载。 目前,仅支持用于 NoSQL 帐户的 Azure Cosmos DB。
先决条件
- 一个现有的适用于 NoSQL 的 Azure Cosmos DB 帐户。
- 如果没有 Azure 订阅, 请尝试免费试用 Azure Cosmos DB for NoSQL。
- 如果有现有的 Azure 订阅, 请创建新的 Azure Cosmos DB for NoSQL 帐户。
- 现有的 Fabric 容量。 如果没有现有容量, 请启动 Fabric 试用版。
- Azure Cosmos DB for NoSQL 帐户必须配置为 Fabric 镜像。 有关详细信息,请参阅 帐户要求。
小窍门
在公共预览版中,建议使用现有 Azure Cosmos DB 数据的测试或开发副本,以便从备份中快速恢复。
在源数据库中创建嵌套数据
在包含不同级别的嵌套 JSON 数据的 Azure Cosmos DB for NoSQL 帐户中创建 JSON 项。
在 Azure 门户中进入 Azure Cosmos DB 帐户。
从资源菜单中选择 数据资源管理器 。
使用 + 新建容器 创建新容器。 对于本指南,请命名容器
TestC。 相应的数据库名称是任意的。多次使用 “+ 新建项 ”选项创建并 保存 这五个 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 数据库配置镜像。 如果不确定如何配置镜像,请参阅 配置镜像数据库教程。
导航到 Fabric 门户。
使用 Azure Cosmos DB 帐户的凭据创建新的连接和镜像数据库。
等待复制完成数据的初始快照。
查询基本嵌套数据
现在,使用 SQL 分析终结点创建可以处理简单嵌套 JSON 数据的查询。
在 Fabric 门户中导航到镜像数据库。
从 镜像 Azure Cosmos DB 切换到 SQL 分析终结点。
打开 测试 表的上下文菜单,然后选择“ 新建 SQL 查询”。
运行此查询以使用
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,就越有可能看到更好的查询性能。在下一个查询中,使用
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 进行操作。 使用同一数据集,我们可以创建查询来平展数据,而无需显式定义架构。
运行此查询以扩展数组
items,OPENJSON而无需定义模式。 这通过将每个嵌套对象分隔为一个新行来平展项数组一个级别。SELECT t.name, t.id, t.country, p.* FROM OrdersDB_TestC as t CROSS APPLY OPENJSON(t.items) p运行此查询以在无需定义架构的情况下,使用
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
创建深度嵌套数据
若要基于此嵌套数据示例进行构建,让我们添加一个深度嵌套的数据示例。
在 Azure 门户中进入 Azure Cosmos DB 帐户。
从资源菜单中选择 数据资源管理器 。
使用 + 新建容器 创建新容器。 对于本指南,请命名容器
TestD。 相应的数据库名称是任意的。多次使用 +新建项 选项创建并 保存 此 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 字符串中的数据。
打开表的
TestD上下文菜单,然后再次选择 “新建 SQL 查询 ”。运行此查询以结合寄售,通过
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 格式表示的子属性,可选展开。最后,运行一个查询,该查询选择何时扩展特定级别的嵌套。
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 查询体验中,不会强制实施嵌套级别的属性限制。