다음을 통해 공유


방법: Azure Cosmos DB에서 가져온 Microsoft Fabric 미러 데이터베이스의 중첩된 데이터 쿼리하기

Microsoft Fabric의 미러된 데이터베이스를 사용하여 Azure Cosmos DB for NoSQL에서 원본으로 사용하는 중첩된 JSON 데이터를 쿼리합니다.

필수 조건

팁 (조언)

백업에서 신속하게 복구할 수 있는 기존 Azure Cosmos DB 데이터의 테스트 또는 개발 복사본을 사용하는 것이 좋습니다.

원본 데이터베이스 내에 중첩된 데이터 만들기

Azure Cosmos DB for NoSQL 계정 내에서 다양한 수준의 중첩된 JSON 데이터를 포함하는 JSON 항목을 만듭니다.

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

미러링 및 필수 구성 요소 설정

NoSQL용 Azure Cosmos DB 데이터베이스에 대한 미러링을 구성합니다. 미러링을 구성하는 방법을 잘 모르는 경우 미러된 데이터베이스 구성 자습서를 참조하세요.

  1. 패브릭 포털로 이동합니다.

  2. Azure Cosmos DB 계정의 자격 증명을 사용하여 새 연결 및 미러된 데이터베이스를 만듭니다.

  3. 복제가 데이터의 초기 스냅샷을 완료할 때까지 기다립니다.

기본 중첩 데이터 쿼리

이제 SQL 분석 엔드포인트를 사용하여 간단한 중첩된 JSON 데이터를 처리할 수 있는 쿼리를 만듭니다.

  1. 패브릭 포털에서 미러된 데이터베이스로 이동합니다.

  2. 미러된 Azure Cosmos DB에서 SQL 분석 엔드포인트로 전환합니다.

    패브릭 포털의 항목 간에 전환할 선택기의 스크린샷.

  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) 쿼리 성능이 저하될 수 있습니다. 대신 wher 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 확장하려면 이 쿼리를 실행합니다. 이렇게 하면 각 중첩된 개체를 새 행으로 분리하여 항목 배열을 한 수준 평면화합니다.

    SELECT
        t.name,
        t.id,
        t.country,
        p.*
    FROM OrdersDB_TestC as t 
    CROSS APPLY OPENJSON(t.items) p
    
  2. 이 쿼리를 실행하여 스키마를 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
    

깊이 중첩된 데이터 만들기

이 중첩된 데이터 예제를 빌드하려면 심층적으로 중첩된 데이터 예제를 추가해 보겠습니다.

  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 다시 선택합니다.

  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 쿼리 환경에서 적용되지 않습니다.