Запрос данных Cosmos DB с помощью Synapse SQL

Завершено

Помимо использования пула Spark, вы также можете запросить аналитический контейнер Azure Cosmos DB с помощью встроенного бессерверного пула SQL в Azure Synapse Analytics. Для этого можно использовать OPENROWSET функцию SQL для подключения к связанной службе для базы данных Azure Cosmos DB.

Использование OPENROWSET с ключом проверки подлинности

По умолчанию доступ к учетной записи Azure Cosmos DB проходит проверку подлинности ключом проверки подлинности. Этот ключ можно использовать как часть строки подключения в инструкции OPENROWSET для подключения через связанную службу из пула SQL, как показано в следующем примере:

SELECT *
FROM OPENROWSET(​
    'CosmosDB',
    'Account=my-cosmos-db;Database=my-db;Key=abcd1234....==',
    [my-container]) AS products_data

Совет

Первичный и вторичный ключ для учетной записи Cosmos DB можно найти на странице Ключи на портале Azure.

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

_rid _ts productID productName id _etag
mjMaAL...== 1655414791 123 Мини-приложение 7248f072-11c3-42b1-a368-... 54004b09-0000-2300-...
mjMaAL...== 1655414829 124 Wotsit dc33131c-65c7-421a-a0f7-... 5400ca09-0000-2300-...
mjMaAL...== 1655414835 125 Thingumy ce22351d-78c7-428a-a1h5-... 5400ca09-0000-2300-...
... ... ... ... ... ...

Данные извлекаются из аналитического хранилища, и запрос не влияет на операционное хранилище.

Использование OPENROWSET с учетными данными

Вместо включения ключа проверки подлинности в каждый вызов OPENROWSET можно определить учетные данные, которые инкапсулируют сведения о проверке подлинности для учетной записи Cosmos DB и использовать их в последующих запросах. Чтобы создать учетные данные, используйте инструкцию CREATE CREDENTIAL, как показано в следующем примере:

 CREATE CREDENTIAL my_credential
 WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
 SECRET = 'abcd1234....==';

Созданные учетные данные можно использовать в функции OPENROWSET следующим образом:

SELECT *
FROM OPENROWSET(​PROVIDER = 'CosmosDB',
                CONNECTION = 'Account=my-cosmos-db;Database=my-db',
                OBJECT = 'my-container',
                SERVER_CREDENTIAL = 'my_credential'
) AS products_data

Результаты снова включают метаданные и поля, определенные приложением, из аналитического хранилища:

_rid _ts productID productName id _etag
mjMaAL...== 1655414791 123 Мини-приложение 7248f072-11c3-42b1-a368-... 54004b09-0000-2300-...
mjMaAL...== 1655414829 124 Wotsit dc33131c-65c7-421a-a0f7-... 5400ca09-0000-2300-...
mjMaAL...== 1655414835 125 Thingumy ce22351d-78c7-428a-a1h5-... 5400ca09-0000-2300-...
... ... ... ... ... ...

Указание схемы

Синтаксис OPENROWSET содержит предложение WITH, которое можно использовать для определения схемы для результирующего набора строк. Это можно использовать для того, чтобы указать отдельные поля и назначить типы данных, как показано в следующем примере:

 SELECT *
 FROM OPENROWSET(​PROVIDER = 'CosmosDB',
                 CONNECTION = 'Account=my-cosmos-db;Database=my-db',
                 OBJECT = 'my-container',
                 SERVER_CREDENTIAL = 'my_credential'
 )
 WITH (
    productID INT,
    productName VARCHAR(20)
 ) AS products_data

В этом случае при условии, что поля в аналитическом хранилище включают productID и productName, набор строк в результате будет выглядеть примерно так:

productID productName
123 Мини-приложение
124 Wotsit
125 Thingumy
... ...

Конечно, можно указать имена отдельных столбцов в предложении SELECT (например, SELECT productID, productName ...), поэтому эта возможность указания отдельных столбцов может показаться ограниченной. Однако бывают случаи, когда в исходных документах JSON, хранящихся в операционном хранилище, есть несколько уровней полей, как показано в следующем примере:

{
    "productID": 126,
    "productName": "Sprocket",
    "supplier": {
        "supplierName": "Contoso",
        "supplierPhone": "555-123-4567"
    }
    "id": "62588f072-11c3-42b1-a738-...",
    "_rid": "mjMaAL...==",
    ...
}

Предложение WITH поддерживает включение явных путей JSON, позволяя обрабатывать вложенные поля и назначать псевдонимы именам полей, как показано в следующем примере:

 SELECT *
 FROM OPENROWSET(​PROVIDER = 'CosmosDB',
                 CONNECTION = 'Account=my-cosmos-db;Database=my-db',
                 OBJECT = 'my-container',
                 SERVER_CREDENTIAL = 'my_credential'
 )
 WITH (
    ProductNo INT '$.productID',
    ProductName VARCHAR(20) '$.productName',
    Supplier VARCHAR(20) '$.supplier.supplierName',
    SupplierPhoneNo VARCHAR(15) '$.supplier.supplierPhone'
 ) AS products_data

Результаты этого запроса будут содержать следующую строку для продукта 126:

ProductNo НаименованиеПродукта Поставщик SupplierPhoneNo
126 Sprocket Contoso 555-123-4567

Создание представления в базе данных

Если требуется часто запрашивать одни и те же данные или использовать средства создания отчетов и визуализации, основанные на инструкциях SELECT, которые не включают функцию OPENROWSET, вы можете использовать представление для абстрагирования данных. Чтобы создать представление, необходимо создать новую базу данных, в которой его можно определить (определяемые пользователем представления в базе данных master не поддерживаются), как показано в следующем примере:

CREATE DATABASE sales_db
   COLLATE Latin1_General_100_BIN2_UTF8;
 GO;

 USE sales_db;
 GO;

 CREATE VIEW products
 AS
 SELECT *
 FROM OPENROWSET(​PROVIDER = 'CosmosDB',
                 CONNECTION = 'Account=my-cosmos-db;Database=my-db',
                 OBJECT = 'my-container',
                 SERVER_CREDENTIAL = 'my_credential'
 )
 WITH (
    ProductNo INT '$.productID',
    ProductName VARCHAR(20) '$.productName',
    Supplier VARCHAR(20) '$.supplier.supplierName',
    SupplierPhoneNo VARCHAR(15) '$.supplier.supplierPhone'
 ) AS products_data
 GO

Совет

При создании базы данных, которая будет получать доступ к данным в Cosmos DB, рекомендуется использовать параметры сортировки на основе UTF-8, чтобы обеспечить совместимость со строками в Cosmos DB.

После создания представления пользователи и клиентские приложения могут запрашивать его как любое другое представление SQL или таблицу:

SELECT * FROM products;

Рекомендации по бессерверным пулам SQL и Azure Cosmos DB

При планировании использования бессерверного пула SQL для запроса данных в аналитическом хранилище Azure Cosmos DB рассмотрите следующие рекомендации.

  • Подготовьте аналитическое хранилище Azure Cosmos DB и любые клиентские приложения (например, Microsoft Power BI) в том же регионе, что и бессерверный пул SQL.

    Контейнеры Azure Cosmos DB можно реплика в несколько регионов. Если у вас есть контейнер, размещенный в нескольких регионах, вы можете параметр region в строке подключения OPENROWSET, чтобы убедиться, что запросы отправляются в определенную региональную реплику контейнера.

  • При работе со строковыми столбцами используйте функцию OPENROWSET с явным предложением WITH и укажите соответствующую длину данных для строковых данных.