当前位置: 首页 > 知识库问答 >
问题:

如何将json文件批量插入azure Cosmos DB (documentDB模块)?

朱岳
2023-03-14

我正在使用python使用documentDB模块更新大量数据文件,并使用新的观察结果。我必须每分钟上传100-200个json文件,上传操作比程序的其他部分占用更多的时间。现在,我正在模块中使用DocumentClient的“UpsertDocument”函数。有更快/更好的方法吗?

共有2个答案

宰父阳焱
2023-03-14

一种选择是使用Cosmos DB Spark连接器,并且可选地(并且方便地)在Azure Databricks中作为作业运行。这将为您的吞吐量提供大量的控制,并使您很容易在并行性(我认为这是问题所在)和Cosmos DB上的RU容量之间找到最佳平衡。

这是加载118K文档时进行测量的一个简单示例,这是使用仅有1个辅助角色的最小规格数据库集群。

Python中的单个Cosmos客户端:236 RUs时28个文档/秒(即根本不推Cosmos)

Spark Cosmos DB适配器,66 docs/sec@

…将Cosmos DB升级到10K RUs Spark Cosmos数据库适配器后,1317文档/秒@

您也可以尝试Python多线程(我认为这会有所帮助),正如CYMA在评论中所说,您应该检查Cosmos DB的限制。不过,我的观察是,单个Cosmos客户端甚至不会让您达到最低400 RU。

雷曜灿
2023-03-14

您可以使用存储过程进行批量插入操作:

function bulkimport2(docObject) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();

// The count of imported docs, also used as current doc index.
var count = 0;

getContext().getResponse().setBody(docObject.items);
//return

// Validate input.
//if (!docObject.items || !docObject.items.length) getContext().getResponse().setBody(docObject);
docObject.items=JSON.stringify(docObject.items)
docObject.items = docObject.items.replace("\\\\r", "");
docObject.items = docObject.items.replace("\\\\n", "");
var docs = JSON.parse(docObject.items);
var docsLength = docObject.items.length;
if (docsLength == 0) {
    getContext().getResponse().setBody(0);
    return;
}

// Call the CRUD API to create a document.
tryCreate(docs[count], callback, collectionLink,count);

// Note that there are 2 exit conditions:
// 1) The createDocument request was not accepted.
//    In this case the callback will not be called, we just call setBody and we are done.
// 2) The callback was called docs.length times.
//    In this case all documents were created and we don't need to call tryCreate anymore. Just call setBody and we are done.
function tryCreate(doc, callback, collectionLink,count ) {
    doc=JSON.stringify(doc);
    if (typeof doc == "undefined") {
        getContext().getResponse().setBody(count);
        return ;
        } else {
        doc = doc.replace("\\r", "");
        doc = doc.replace("\\n", "");
        doc=JSON.parse(doc);
       }

    getContext().getResponse().setBody(doc);

    var isAccepted = collection.upsertDocument(collectionLink, doc, callback);

    // If the request was accepted, callback will be called.
    // Otherwise report current count back to the client, 
    // which will call the script again with remaining set of docs.
    // This condition will happen when this stored procedure has been running too long
    // and is about to get cancelled by the server. This will allow the calling client
    // to resume this batch from the point we got to before isAccepted was set to false
    if (!isAccepted) {
        getContext().getResponse().setBody(count);
     }
}

// This is called when collection.createDocument is done and the document has been persisted.
function callback(err, doc, options) {
    if (err) throw getContext().getResponse().setBody(err + doc);

    // One more document has been inserted, increment the count.
    count++;

    if (count >= docsLength) {
        // If we have created all documents, we are done. Just set the response.
        getContext().getResponse().setBody(count);
        return ;
    } else {
        // Create next document.
        tryCreate(docs[count], callback,  collectionLink,count);
    }
}

然后你可以加载python并执行它。请注意,存储过程需要分区键。

希望它有所帮助。

 类似资料:
  • 问题内容: 我有一些类似的代码,用于将数据文件批量插入表中,其中数据文件和表名是变量: 对于标准表来说,它的工作正常,但是现在我需要做同样的事情才能将数据加载到 临时 表中(例如)。但是当我尝试这个时,我得到了错误: 我认为问题是由于以下事实造成的:该语句是动态构造的,然后使用来执行,并且在调用上下文中是不可访问的。 之所以需要构造这样的语句,是因为我需要在该语句中插入文件名,这似乎是唯一的方法。

  • 问题内容: 我正在尝试使用Nest将多个记录插入数据库。使用IndexMany类插入确实可以,但是我还需要通过json字符串插入对象。 我确实在github上进行了查找,并找到了一些如何使用RAWclient的示例。在代码示例下面,我插入json。 一些其他信息: jsondata: var twitter: 我从数据库收到的结果: 有人知道这个问题可能是什么吗?还是我在json /代码中丢失了什

  • 本文向大家介绍如何执行批量插入?相关面试题,主要包含被问及如何执行批量插入?时的应答技巧和注意事项,需要的朋友参考一下 首先,创建一个简单的 insert 语句:   然后在 java 代码中像下面这样执行批处理插入:

  • 问题内容: 我有以下查询要插入到表中 得到消息 消息4860,级别16,状态1,行1 无法批量加载。文件“ c:\ Type.txt”不存在。 该文件显然在那里。我可能会忽略什么? 问题答案: 看一下: 无法批量加载。文件“ c:\data.txt”不存在 该文件在SQL Server的驱动器上吗? SQL BULK INSERT等始终只能与SQL Server计算机上的本地驱动器一起使用。您的S

  • 问题内容: 我正在使用Angular Maps构建地图应用程序,并希望导入JSON文件作为定义位置的标记列表。我希望将此JSON文件用作app.component.ts中的marker []数组。而不是在TypeScript文件中定义标记的硬编码数组。 导入此JSON文件以在我的项目中使用的最佳过程是什么?任何方向都非常感谢! 问题答案: 直到最近的打字稿更新之前,Aonepathan的单行代码都

  • 问题内容: 我有一些要导入mySQL的CSV数据文件。我想在shell脚本中进行插入,以便可以将其自动化。但是,我对在脚本中使用明文形式输入用户名和密码感到有些厌倦 我有以下问题: 我对脚本中明文中的uname / pwd的想法感到不满意(反正还是这样,还是我太偏执)?也许我可以为插入表设置仅具有INSERT特权的用户? 数据库表(导入原始数据的数据库表)具有基于表列的唯一键。我尝试导入的数据中也