方法: Azure Cosmos DB から Microsoft Fabric ミラーデータベース内の入れ子になったデータにクエリを実行します (プレビュー)
Microsoft Fabric のミラーデータベースを使用して、Azure Cosmos DB for NoSQL からソース化された入れ子になった JSON データに対してクエリを実行します。
重要
Azure Cosmos DB のサポートは現在プレビュー段階です。 プレビュー期間中は、運用環境のワークロードはサポートされていません。 現在、Azure Cosmos DB for NoSQL アカウントのみでサポートされています。
前提条件
- 既存の Azure Cosmos DB for NoSQL アカウント。
- Azure サブスクリプションをお持ちでない場合は、Azure Cosmos DB for NoSQL を無料でお試しください。
- 既存の Azure サブスクリプションをお持ちの場合は、新しい Azure Cosmos DB for NoSQL アカウントを作成してください。
- 既存の Fabric 容量。 既存の容量がない場合は、Fabric 試用版を開始します。
- Azure Cosmos DB for NoSQL アカウントは、Fabric ミラーリング用に構成する必要があります。 詳細については、「アカウントの要件」をご覧ください。
ヒント
パブリック プレビュー期間中は、バックアップから迅速に復旧できる既存の Azure Cosmos DB データのテスト コピーまたは開発コピーを使用することをお勧めします。
ソース データベース内に入れ子になったデータを作成する
入れ子になった JSON データのさまざまなレベルを含む JSON 項目を Azure Cosmos DB for NoSQL アカウント内に作成します。
Azure portal で Azure Cosmos DB アカウントに移動します。
リソース メニューで [データ エクスプローラー] を選択します。
[+ 新しいコンテナー] を使用して、新しいコンテナーを作成します。 このガイドでは、コンテナー
TestC
に名前を付けます。 対応するデータベース名は任意です。[+ 新しい項目] オプションを複数回使用して、これら 5 つの 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)
を使用すると、クエリのパフォーマンスが低下する可能性があります。 代わりに、n
には任意の数値を指定できるvarchar(n)
を使用します。n
が低いほど、クエリのパフォーマンスが向上する可能性が高くなります。items
配列を持つ項目のみを表示するには、次のクエリでCROSS APPLY
を使用します。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
深く入れ子になったデータを作成する
この入れ子になったデータの例を基にして、深く入れ子になったデータの例を追加しましょう。
Azure portal で 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" } }
深く入れ子になったデータに対してクエリを実行する
最後に、JSON 文字列で深く入れ子になったデータを検索できる T-SQL クエリを作成します。
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
Note
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
Note
入れ子になったレベルのプロパティ制限は、この T-SQL クエリ エクスペリエンスでは適用されません。