Поделиться через


Практическое руководство. Запрос вложенных данных в зеркальных базах данных Microsoft Fabric из Azure Cosmos DB

Используйте зеркальную базу данных в Microsoft Fabric для запроса вложенных данных JSON из Azure Cosmos DB для NoSQL.

Предпосылки

Подсказка

Рекомендуется использовать тестовую копию или копию для разработки ваших существующих данных Azure Cosmos DB, которые можно быстро восстановить из резервной копии.

Создание вложенных данных в исходной базе данных

Создайте элементы JSON в учетной записи Azure Cosmos DB для NoSQL, содержащую различные уровни вложенных данных JSON.

  1. Перейдите к учетной записи Azure Cosmos DB на портале Azure.

  2. Выберите Обозреватель данных из меню ресурсов.

  3. Используйте +Создать контейнер для создания нового контейнера. В этом руководстве укажите имя контейнера TestC. Соответствующее имя базы данных является произвольным.

  4. Используйте параметр +Создать элемент несколько раз, чтобы создать и сохранить эти пять элементов 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 для NoSQL. Если вы не уверены, как настроить зеркальное отображение, ознакомьтесь с руководством по настройке зеркальной базы данных.

  1. Перейдите на портал Fabric.

  2. Создайте новое подключение и зеркальную базу данных с помощью учетных данных учетной записи Azure Cosmos DB.

  3. Дождитесь завершения начального моментального снимка данных репликации.

Запрос базовых вложенных данных

Теперь используйте конечную точку аналитики SQL для создания запроса, который может обрабатывать простые вложенные данные JSON.

  1. Перейдите к зеркальной базе данных на портале Fabric.

  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) wher 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 Cosmos DB на портале Azure.

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

Запрос глубоко вложенных данных

Наконец, создайте запрос T-SQL, который может найти данные, глубоко вложенные в строку JSON.

  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 
    

    Замечание

    При развертывании packagesitems представляется в формате 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.