Dotazování dat Cosmos DB pomocí Sparku
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.