在Azure Cosmos DB上创建集合太慢

时间:2018-06-24 20:41:06

标签: python azure azure-cosmosdb azure-cosmosdb-sqlapi

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

原始csv约为431 MB和5173620个寄存器(行),这意味着我需要将每个寄存器(行)作为新文档提取。我发现createDocument()函数的运行速度非常慢(所有寄存器要花一天以上的时间才能完成)。虽然单分区Cosmos db限制为10000 RU,但“对所有文档进行计数”查询花费了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)

1 个答案:

答案 0 :(得分:0)

  

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

添加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这样的错误。考虑到您的经济问题,我们不建议您不断增加RU设置。您可以考虑使用存储过程批量导入数据。请参考{{3 }}。

  

3。其他选择。

您可以使用official doc将csv文件中的数据直接导入cosmos db。请参考我先前的回答:Azure Data Factory中的步骤。只需转换输入和输出即可。


更新:

  

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

Cosmos db存储过程是在cosmos db服务器端运行的js代码片段。因此,如果使用它批量导入数据,则可能会减轻客户端的压力。

  

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

Cosmos DB存储过程是在cosmos db服务器端运行的js代码片段。您可以在Convert JSON to CSV in Azure Cosmos DB or Azure Blob中调用存储过程。

  

关于Data Factory,可以自动执行以下过程:   推广到不同的集合和数据库?

基于cosmos db python sdk,您需要配置集合名称。因此,您无法为不同的集合创建数据集。当然,您可以根据需要在sdk中更改集合名称,而不用创建多个数据集。

任何担心,请随时让我知道。