适用范围:
NoSQL
本教程介绍如何使用 Visual Studio Code Jupyter 笔记本与 Azure Cosmos DB for NoSQL 帐户进行交互。 你将了解如何连接到帐户、导入数据和运行查询。
先决条件
创建新的 Notebook
在本部分,你将创建 Azure Cosmos 数据库和容器,并将零售数据导入该容器。
- 打开 Visual Studio Code。
- 从命令面板 (Ctrl+Shift+P) 运行“创建:新 Jupyter 笔记本”命令,或在工作区中创建新的 .ipynb 文件。
打开 Visual Studio Code。
从命令面板 (Ctrl+Shift+P) 运行“Polyglot 笔记本:创建新的空白笔记本”命令。
选择 .ipynb 文件扩展名。
选择 C# 作为默认语言。
提示
创建新笔记本后,可以保存它并将其命名为类似于 AnalyzeRetailData.ipynb。
使用 SDK 创建数据库和容器
从默认代码单元格开始。
安装 Azure.cosmos 包。 继续操作之前,请运行此单元。
%pip install azure.cosmos
导入本教程所需的所有包。
import azure.cosmos
from azure.cosmos.partition_key import PartitionKey
from azure.cosmos import CosmosClient
创建 CosmosClient 的新实例。
endpoint = "<FILL ME>"
key = "<FILL ME>"
cosmos_client = CosmosClient(url=endpoint, credential=key)
使用内置 SDK 创建名为“RetailIngest”的数据库。
database = cosmos_client.create_database_if_not_exists('RetailIngest')
使用 /CartID
分区键创建名为“WebsiteMetrics”的容器。
container = database.create_container_if_not_exists(id='WebsiteMetrics', partition_key=PartitionKey(path='/CartID'))
选择“运行”以创建数据库和容器资源。
从默认代码单元格开始。
安装 Microsoft.Azure.Cosmos NuGet 包。 在继续操作之前运行此单元。
#r "nuget: Microsoft.Azure.Cosmos"
创建新代码单元格。
导入本教程所需的所有包。
using Microsoft.Azure.Cosmos;
使用内置 SDK 创建客户端类型的新实例。 填写 Azure Cosmos DB 帐户的 URI 终结点和密钥。 可以在 Azure Cosmos DB 帐户的“密钥”页中找到这些值。
var endpoint = "<FILL ME>";
var key = "<FILL ME>";
var cosmosClient = new CosmosClient(Cosmos.Endpoint, Cosmos.Key);
创建名为“RetailIngest”的数据库。
Database database = await cosmosClient.CreateDatabaseIfNotExistsAsync("RetailIngest");
使用 /CartID
分区键创建名为“WebsiteMetrics”的容器。
Container container = await database.CreateContainerIfNotExistsAsync("WebsiteMetrics", "/CartID");
选择“执行单元”以创建数据库和容器资源。
将数据导入容器
添加新的代码单元
在代码单元中,添加以下代码以从此 URL 上传数据:<https://cosmosnotebooksdata.blob.core.chinacloudapi.cn/notebookdata/websiteData.json>
。
import urllib.request
import json
with urllib.request.urlopen("https://cosmosnotebooksdata.blob.core.chinacloudapi.cn/notebookdata/websiteData.json") as url:
docs = json.loads(url.read().decode())
for doc in docs:
container.upsert_item(doc)
运行该单元。 这需要 45 秒到 1 分钟才能运行。
添加一个新代码单元格。
在代码单元格中,创建一个新的 C# 类来表示容器中的项。 运行该单元。
public class Record
{
public string id { get; set; }
public int CartID { get; set; }
public string Action { get; set; }
public decimal Price { get; set; }
public string Country { get; set; }
public string Item { get; set; }
}
添加一个新代码单元格。
在代码单元中,添加以下代码以从此 URL 上传数据:<https://cosmosnotebooksdata.blob.core.chinacloudapi.cn/notebookdata/websiteData.json>
。
using System.Net.Http;
using System.Text.Json;
using System.IO;
var dataURL = "https://cosmosnotebooksdata.blob.core.chinacloudapi.cn/notebookdata/websiteData.json";
var jsonData = new HttpClient().GetStringAsync(dataURL).Result;
Record[] result = JsonSerializer.Deserialize<Record[]>(jsonData);
foreach (Record record in result) {
await container.UpsertItemAsync<Record>(record, new PartitionKey(record.CartID)); //43 seconds
}
运行该单元。 这需要 45 秒到 1 分钟才能运行。
分析数据
另创建一个新的代码单元格。
在代码单元格中,使用 SQL 查询填充 Pandas DataFrame。 运行此单元格。
import pandas as pd
from pandas import DataFrame
QUERY = "SELECT c.Action, c.Price as ItemRevenue, c.Country, c.Item FROM c"
results = container.query_items(
query=QUERY, enable_cross_partition_query=True
)
df_cosmos = pd.DataFrame(results)
另创建一个新的代码单元格。
在代码单元格中,输出数据帧的前 10 项。 运行此单元格。
df_cosmos.head(10)
观察运行命令的输出。
|
操作 |
ItemRevenue |
Country |
项 |
0 |
已购买 |
19.99 |
马其顿 |
纽扣衬衫 |
1 |
已查看 |
12.00 |
巴布亚新几内亚 |
项链 |
2 |
已查看 |
25.00 |
斯洛伐克(斯洛伐克共和国) |
开襟毛衣 |
3 |
已购买 |
14.00 |
塞内加尔 |
人字拖 |
4 |
已查看 |
50.00 |
巴拿马 |
牛仔短裤 |
5 |
已查看 |
14.00 |
塞内加尔 |
人字拖 |
6 |
已添加 |
14.00 |
塞内加尔 |
人字拖 |
7 |
已添加 |
50.00 |
巴拿马 |
牛仔短裤 |
8 |
已购买 |
33.00 |
巴勒斯坦占领区 |
红色上衣 |
9 |
已查看 |
30.00 |
马耳他 |
绿色毛衣 |
另创建一个新的代码单元格。
在代码单元格中,导入 pandas 包以自定义数据帧的输出。 运行此单元格。
import pandas as pd
df_cosmos.groupby("Item").size().reset_index()
观察运行命令的输出。
|
Item |
测试 |
0 |
人字拖 |
66 |
1 |
项链 |
55 |
2 |
运动鞋 |
111 |
... |
... |
... |
45 |
防风夹克 |
56 |
创建新代码单元格。
在代码单元中,添加代码以使用 SDK 执行 SQL 查询,将查询的输出存储在名为“结果”的类型变量中。
using System.Collections.Generic;
var query = new QueryDefinition(
query: "SELECT c.Action, c.Price, c.Country, c.Item FROM c"
);
FeedIterator<Record> feed = container.GetItemQueryIterator<Record>(
queryDefinition: query
);
var results = new List<Record>();
while (feed.HasMoreResults)
{
FeedResponse<Record> response = await feed.ReadNextAsync();
foreach (Record result in response)
{
results.Add(result);
}
}
另创建一个新的代码单元格。
在代码单元中,通过将“Item”字段的唯一排列添加为键,将“Price”字段的和添加为值,从而创建字典。 这给出了每个物品的总销售额。 运行此单元格。
var dictionary = new Dictionary<string, decimal>();
foreach(var result in results)
{
if (dictionary.ContainsKey(result.Item)) {
dictionary[result.Item] += result.Price;
}
else {
dictionary.TryAdd (result.Item, result.Price);
}
}
dictionary
观察具有“Item”和“Price”字段的唯一组合的输出。
...
Black Tee: 603
Flannel Shirt: 1199.40
Socks: 210.00
Rainjacket: 2695
...
后续步骤