Dotazování dat Cosmos DB pomocí Sparku

Dokončeno

Po přidání propojené služby pro databázi Azure Cosmos DB s povoleným analytickým úložištěm můžete pomocí ní dotazovat data pomocí fondu Sparku v pracovním prostoru Azure Synapse Analytics.

Načítání analytických dat Azure Cosmos DB do datového rámce

Při počátečním zkoumání nebo rychlé analýze dat z propojené služby Azure Cosmos DB je často nejjednodušší načíst data z kontejneru do datového rámce pomocí jazyka podporovaného Sparkem, jako je PySpark (implementace Pythonu specifická pro Spark) nebo Scala (jazyk založený na Javě, který se často používá ve Sparku).

Například následující kód PySpark lze použít k načtení datového rámce s názvem df z dat v kontejneru my-container připojeném pomocí propojené služby my_linked_service a zobrazení prvních 10 řádků dat:

 df = spark.read
     .format("cosmos.olap")\
     .option("spark.synapse.linkedService", "my_linked_service")\
     .option("spark.cosmos.container", "my-container")\
     .load()

display(df.limit(10))

Předpokládejme, že kontejner my-container se používá k ukládání položek podobných následujícímu příkladu:

{
    "productID": 123,
    "productName": "Widget",
    "id": "7248f072-11c3-42b1-a368-...",
    "_rid": "mjMaAL...==",
    "_self": "dbs/mjM...==/colls/mjMaAL...=/docs/mjMaAL...==/",
    "_etag": "\"54004b09-0000-2300-...\"",
    "_attachments": "attachments/",
    "_ts": 1655414791
}

Výstup kódu PySpark by byl podobný následující tabulce:

_rid _ts productID productName ID _etag
mjMaAL...== 1655414791 123 Widget 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-...
... ... ... ... ... ...

Data se načtou z analytického úložiště v kontejneru, ne z provozního úložiště; zajištění, že provozní úložiště nemá žádné režijní náklady na dotazování. Pole v analytickém úložišti dat obsahují pole definovaná aplikací (v tomto případě PRODUCTID a productName) a automaticky vytvořená pole metadat.

Po načtení datového rámce můžete k prozkoumání dat použít jeho nativní metody. Například následující kód vytvoří nový datový rámec obsahující pouze sloupce productID a productName seřazené podle productName:

products_df = df.select("productID", "productName").orderBy("productName")

display(products_df.limit(10))

Výstup tohoto kódu by vypadal podobně jako tato tabulka:

productID productName
125 Thingumy
123 Widget
124 Wotsit
... ...

Zápis datového rámce do kontejneru Cosmos DB

Ve většině scénářů HTAP byste měli použít propojenou službu ke čtení dat do Sparku z analytického úložiště. Obsah datového rámce však můžete napsat do kontejneru, jak je znázorněno v následujícím příkladu:

mydf.write.format("cosmos.oltp")\
    .option("spark.synapse.linkedService", "my_linked_service")\
    .option("spark.cosmos.container", "my-container")\
    .mode('append')\
    .save()

Poznámka:

Zápis datového rámce do kontejneru aktualizuje provozní úložiště a může mít vliv na jeho výkon. Změny se pak synchronizují do analytického úložiště.

Použití Spark SQL k dotazování analytických dat Azure Cosmos DB

Spark SQL je rozhraní Spark API, které poskytuje syntaxi jazyka SQL a sémantiku relační databáze ve fondu Sparku. Spark SQL můžete použít k definování metadat pro tabulky, které se dají dotazovat pomocí SQL.

Například následující kód vytvoří tabulku s názvem Products na základě hypotetického kontejneru použitého v předchozích příkladech:

%%sql

-- Create a logical database in the Spark metastore
CREATE DATABASE mydb;

USE mydb;

-- Create a table from the Cosmos DB container
CREATE TABLE products using cosmos.olap options (
    spark.synapse.linkedService 'my_linked_service',
    spark.cosmos.container 'my-container'
);

-- Query the table
SELECT productID, productName
FROM products;

Tip

Klíčové %%sql slovo na začátku kódu je magie , která dává fondu Spark pokyn ke spuštění kódu jako SQL místo výchozího jazyka (který je obvykle nastaven na PySpark).

Pomocí tohoto přístupu můžete vytvořit logickou databázi ve fondu Sparku, kterou pak můžete použít k dotazování analytických dat ve službě Azure Cosmos DB, aby podporovala úlohy analýzy a generování sestav, aniž by to mělo vliv na provozní úložiště ve vašem účtu služby Azure Cosmos DB.