使用 Microsoft Fabric 中的鏡像資料庫來查詢來源自適用於 NoSQL 的 Azure Cosmos DB 的巢狀 JSON 資料。
先決條件
- 現有的適用於 NoSQL 的 Azure Cosmos DB 帳戶。
- 如果您沒有 Azure 訂用帳戶,請 免費試用適用於 NoSQL 的 Azure Cosmos DB。
- 如果您有現有的 Azure 訂用帳戶,請 建立新的適用於 NoSQL 的 Azure Cosmos DB 帳戶。
- 現有的 Fabric 容量。 如果您沒有現有的容量,請 啟動 Fabric 試用版。
- 必須針對網狀架構鏡像設定適用於 NoSQL 的 Azure Cosmos DB 帳戶。 如需詳細資訊,請參閱 帳戶需求。
小提示
建議使用可快速從備份中恢復的現有 Azure Cosmos 資料庫測試或開發副本。
在來源資料庫內建立巢狀資料
在適用於 NoSQL 的 Azure Cosmos DB 帳戶內建立 JSON 專案,其中包含不同層級的巢狀 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" }
設定鏡像和必要條件
設定適用於 NoSQL 的 Azure Cosmos DB 資料庫的鏡像。 如果您不確定如何設定鏡像,請參閱 設定鏡像資料庫教學課程。
流覽至 Fabric 入口網站。
使用 Azure Cosmos DB 帳戶的認證建立新的連線和鏡像資料庫。
等待複寫完成資料的初始快照。
查詢基本巢狀資料
現在,使用 SQL 分析端點來建立可處理簡單巢狀 JSON 資料的查詢。
流覽至 Fabric 入口網站中的鏡像資料庫。
從 鏡像 Azure Cosmos DB 切換至 SQL 分析端點。
開啟 測試 資料表的內容功能表,然後選取 [ 新增 SQL 查詢]。
執行此查詢以
items展開OPENJSON陣列 。 此查詢用來OUTER APPLY包含可能沒有 items 陣列的額外專案。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)whern可以是任何數字。 越低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執行此查詢以進一步擴充
items陣列OPENJSON,而不定義結構描述。 這會將每個巢狀物件內的每個屬性分隔成新資料列,將專案陣列平面化兩個層級。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 查詢 ]。執行此查詢,以使用 withsignment 來
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 查詢體驗中,不會強制執行巢狀層級的屬性限制。