Synapse SQL ile Cosmos DB sorgulama

Tamamlandı

Spark havuzu kullanmanın yanı sıra Azure Synapse Analytics'teki yerleşik sunucusuz SQL havuzunu kullanarak azure Cosmos DB analiz kapsayıcısını da sorgulayabilirsiniz. Bunu yapmak için SQL işlevini kullanarak OPENROWSET Azure Cosmos DB veritabanınızın bağlı hizmetine bağlanabilirsiniz.

Kimlik doğrulama anahtarıyla OPENROWSET kullanma

Varsayılan olarak, bir Azure Cosmos DB hesabına erişimin kimliği bir kimlik doğrulama anahtarıyla doğrulanır. Aşağıdaki örnekte gösterildiği gibi, sql havuzundan bağlı bir hizmet üzerinden bağlanmak için bu anahtarı deyimindeki bir bağlantı dizesi OPENROWSET parçası olarak kullanabilirsiniz:

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

Bahşiş

Cosmos DB hesabınız için birincil ve ikincil anahtarı Azure portalındaki Anahtarlar sayfasında bulabilirsiniz.

Bu sorgunun sonuçları, Azure Cosmos DB kapsayıcısı içindeki öğelerden meta veriler ve uygulama tanımlı alanlar da dahil olmak üzere aşağıdakine benzer olabilir:

_rid _ts productID Productname kimlik _etag
mjMaAL...== 1655414791 123 Arabirim öğesi 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-...
... ... ... ... ... ...

Veriler analiz deposundan alınır ve sorgu işlem deposunu etkilemez.

Kimlik bilgileriyle OPENROWSET kullanma

OpenROWSET'e yapılan her çağrıya kimlik doğrulama anahtarını eklemek yerine Cosmos DB hesabınızın kimlik doğrulama bilgilerini kapsülleyen bir kimlik bilgisi tanımlayabilir ve sonraki sorgularda kimlik bilgilerini kullanabilirsiniz. Kimlik bilgisi oluşturmak için bu örnekte gösterildiği gibi deyimini CREATE CREDENTIAL kullanın:

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

Kimlik bilgileri yerinde olduğunda, bunu aşağıdaki gibi bir OPENROWSET işlevde kullanabilirsiniz:

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

Sonuçlar bir kez daha analiz deposundan meta verileri ve uygulama tanımlı alanları içerir:

_rid _ts productID Productname kimlik _etag
mjMaAL...== 1655414791 123 Arabirim öğesi 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-...
... ... ... ... ... ...

Şema belirtme

Söz OPENROWSET dizimi, sonuçta elde edilen satır kümesi için şema tanımlamak için kullanabileceğiniz bir yan tümce içerir WITH . Aşağıdaki örnekte gösterildiği gibi tek tek alanları belirtmek ve veri türleri atamak için bunu kullanabilirsiniz:

 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

Bu durumda analiz deposundaki alanların productID ve productName içerdiği varsayıldığında, sonuçta elde edilen satır kümesi aşağıdaki tabloya benzer:

productID Productname
123 Arabirim öğesi
124 Wotsit
125 Thingumy
... ...

Yan tümcesinde SELECT tek tek sütun adları belirtebilirsiniz (örneğin, SELECT productID, productName ...), bu nedenle tek tek sütunları belirtme özelliği sınırlı kullanım gibi görünebilir. Ancak, aşağıdaki örnekte gösterildiği gibi işletimsel depoda depolanan kaynak JSON belgelerinin birden çok alan düzeyi içerdiği durumları göz önünde bulundurun:

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

WITH yan tümcesi, açık JSON yollarının eklenmesini destekleyerek iç içe alanları işlemenize ve alan adlarına diğer ad atamanıza olanak tanır; bu örnekte gösterildiği gibi:

 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

Bu sorgunun sonuçları, 126 ürünü için aşağıdaki satırı içerir:

ProductNo ProductName Supplier Sağlayıcı Telefon No
126 Sprocket Contoso 555-123-4567

Veritabanında görünüm oluşturma

Aynı verileri sık sık sorgulamanız veya işlevi içermeyen deyimleri kullanan SELECT raporlama ve görselleştirme araçlarını kullanmanız gerekiyorsa, verileri soyutlama amacıyla bir görünüm kullanabilirsiniz.OPENROWSET Bir görünüm oluşturmak için, aşağıdaki örnekte gösterildiği gibi bu veritabanını tanımlayacak yeni bir veritabanı oluşturmanız gerekir (ana veritabanındaki kullanıcı tanımlı görünümler desteklenmez):

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

Bahşiş

Cosmos DB'deki verilere erişecek bir veritabanı oluştururken, Cosmos DB'deki dizelerle uyumluluğu sağlamak için UTF-8 tabanlı harmanlama kullanmak en iyisidir.

Görünüm oluşturulduktan sonra, kullanıcılar ve istemci uygulamaları bunu diğer SQL görünüm veya tabloları gibi sorgulayabilir:

SELECT * FROM products;

Sunucusuz SQL havuzları ve Azure Cosmos DB ile ilgili dikkat edilmesi gerekenler

Azure Cosmos DB analiz deposundaki verileri sorgulamak için sunucusuz SQL havuzu kullanmayı planlarken aşağıdaki en iyi yöntemleri göz önünde bulundurun:

  • Azure Cosmos DB analiz depolama alanınızı ve sunucusuz SQL havuzuyla aynı bölgede bulunan tüm istemci uygulamalarını (örneğin Microsoft Power BI) sağlayın.

    Azure Cosmos DB kapsayıcıları birden çok bölgeye çoğaltılabilir. Çok bölgeli bir kapsayıcınız varsa, sorguların kapsayıcının belirli bir region bölgesel çoğaltmasına gönderilmesini sağlamak için OPENROWSET bağlantı dizesi bir parametre belirtebilirsiniz.

  • Dize sütunlarıyla çalışırken open WITH yan tümcesi ile OPENROWSET işlevini kullanın ve dize verileri için uygun bir veri uzunluğu belirtin.