1

我正在尝试使用 pydocumentdb 使用 Python 将 CSV 文档自动上传到 Azure Cosmos SQL API DB。我正在使用 pandas 执行一些数据预处理,然后将每一行转换为 JSON 格式。最后,我为 CSV 的每个转换行创建一个文档。

原始 csv 大约 431 MB 和 5173620 个寄存器(行),这意味着我需要将每个寄存器(行)作为新文档摄取。我发现 createDocument() 函数非常慢(完成所有寄存器需要一天多的时间)。虽然单分区 Cosmos db 限制为 10000 RU,但 Count all documents 查询花费 29025.92 RU,结果似乎不准确。

我想知道是否有办法提高 createDocument 函数的性能。另外我想知道如何在 createCollection 函数上定义 RU。欢迎任何提示。

# create document
coll_link = createColl(client, db_link, coll_id)

... preprocess a pandas Dataframe df...

# create a collection
for index, row in df.iterrows():
    doc = row.to_dict()
    client.CreateDocument(coll_link, doc)
4

1 回答 1

0

1.我想知道如何在createCollection函数上定义RUs。

添加offerThroughput参数。

databaseLink = "dbs/db"
coll = {
        "id": "testCreate",
        "indexingPolicy": {
            "indexingMode": "lazy",
            "automatic": False
        },
        "partitionKey": {
            "paths": [
              "/AccountNumber"
            ],
            "kind": "Hash"
        }
       }
collection_options = { 'offerThroughput': 2000}
client.CreateCollection(databaseLink , coll, collection_options)

2.不知道有没有办法提高createDocument函数的性能。

首先,我不认为createDocument()函数很慢,而是应该是你的整个导入过程很慢,因为你的数据。根据您的描述,您不会遇到Request rate is too large之类的错误。考虑到您的经济问题,我不建议您无休止地增加RUs设置。您可以考虑使用存储过程来批量导入您的数据。请参考官方文档中的示例。

3.其他选择。

您可以使用Azure 数据工厂将数据从 csv 文件直接导入 cosmos db。请参考我之前回答中的步骤:在 Azure Cosmos DB 或 Azure Blob 中将 JSON 转换为 CSV。只需转换输入和输出。


更新:

使用批量导入程序有哪些好处?

Cosmos db 存储过程是运行在 cosmos db 服务器端的一段 js 代码。所以如果你用它来批量导入数据,它可以释放你的客户端的压力。

我可以在我的 Python 代码上添加 Java 编码的存储过程吗?

Cosmos DB 存储过程是运行在 cosmos db 服务器端的 js 代码片段。您可以在cosmos db python sdk中调用存储过程。

关于数据工厂,是否可以自动化流程以推广到不同的集合和数据库?

根据Azure 数据工厂 Cosmos DB 数据集属性,您需要配置集合名称。所以你不能为不同的集合创建数据集。当然,您可以根据需要更改 sdk 中的集合名称,而不是创建多个数据集。

任何问题,请随时告诉我。

于 2018-06-25T02:31:32.893 回答