次の方法で共有


方法: Azure Cosmos DB から Microsoft Fabric ミラー化データベースの入れ子になったデータにクエリを実行する

Microsoft Fabric のミラー化されたデータベースを使用して、Azure Cosmos DB for NoSQL からソース化された入れ子になった JSON データに対してクエリを実行します。

[前提条件]

ヒント

バックアップから迅速に復旧できる既存の Azure Cosmos DB データのテストまたは開発コピーを使用することをお勧めします。

ソース データベース内に入れ子になったデータを作成する

入れ子になった JSON データのさまざまなレベルを含む JSON 項目を Azure Cosmos DB for NoSQL アカウント内に作成します。

  1. Azure portal で Azure Cosmos DB アカウントに移動します。

  2. リソース メニューから [データ エクスプローラー ] を選択します。

  3. + 新しいコンテナーを使用して新しいコンテナーを作成します。 このガイドでは、コンテナーに TestCという名前を付けます。 対応するデータベース名は任意です。

  4. [+ 新しい項目] オプションを複数回使用して、これら 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 データベースのミラーリングを構成します。 ミラーリングを構成する方法がわからない場合は、ミラー 化されたデータベースの構成に関するチュートリアルを参照してください。

  1. Fabric ポータルに移動します。

  2. Azure Cosmos DB アカウントの資格情報を使用して、新しい接続とミラー化されたデータベースを作成します。

  3. レプリケーションがデータの初期スナップショットを完了するまで待ちます。

入れ子になった基本的なデータに対してクエリを実行する

次に、SQL 分析エンドポイントを使用して、単純な入れ子になった JSON データを処理できるクエリを作成します。

  1. ファブリック ポータルでミラー化されたデータベースに移動します。

  2. ミラー化された Azure Cosmos DB から SQL 分析エンドポイントに切り替えます。

    Fabric ポータルで項目を切り替えるセレクターのスクリーンショット。

  3. テスト テーブルのコンテキスト メニューを開き、[新しい SQL クエリ] を選択します。

  4. このクエリを実行して、itemsを使用してOPENJSON配列を展開します。 このクエリでは、 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. スキーマを定義せずにitemsを使用してOPENJSON配列を展開するには、このクエリを実行します。 これにより、入れ子になった各オブジェクトを新しい行に分離することで、項目配列が 1 レベルフラット化されます。

    SELECT
        t.name,
        t.id,
        t.country,
        p.*
    FROM OrdersDB_TestC as t 
    CROSS APPLY OPENJSON(t.items) p
    
  2. スキーマを定義せずにitemsを使用してOPENJSON配列をさらに拡張するには、このクエリを実行します。 これにより、入れ子になった各オブジェクト内の各プロパティを新しい行に分離することで、項目配列の 2 つのレベルがフラット化されます。

    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 portal で 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"
      }
    }
    

深く入れ子になったデータに対してクエリを実行する

最後に、JSON 文字列で深く入れ子になったデータを検索できる T-SQL クエリを作成します。

  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 クエリ エクスペリエンスでは適用されません。