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

使用c#在cassandra中批量插入

卫子平
2023-03-14

我是卡桑德拉的新人。我必须使用c#在卡桑德拉中一次性插入50000行。我正在使用卡桑德拉c#驱动程序。我正在使用以下代码在卡桑德拉中插入数据。请帮帮我

string tableName = "" + ConfigurationManager.AppSettings["tableName"];
            string keySpace = "test";// "" + ConfigurationManager.AppSettings["Keyspace"];
            //string query = "INSERT INTO " + tableName + " (emp_name, emp_position,emp_firstname,uniqueid) VALUES (?, ?,?,?)"; //; "SELECT * FROM "+ tableName + " limit 2 ";
            string query = string.Empty;
            query =
"BEGIN BATCH " +
"INSERT INTO " + tableName + " (emp_name, emp_position,emp_firstname,uniqueid) VALUES (?, ?,?,?);" +
"INSERT INTO " + tableName + " (emp_name, emp_position,emp_firstname,uniqueid) VALUES (?, ?,?,?);" +
"INSERT INTO " + tableName + " (emp_name, emp_position,emp_firstname,uniqueid) VALUES (?, ?,?,?);" +
" APPLY BATCH";

BatchStatement(keySpace, query,
                    Convert.ToString("ashish" + i), 2, Convert.ToString("Mohan" + i), System.Guid.NewGuid(),
                    Convert.ToString("ashish" + i), 2, Convert.ToString("Mohan" + i), System.Guid.NewGuid(),
                    Convert.ToString("ashish" + i), 2, Convert.ToString("Mohan" + i), System.Guid.NewGuid()
public void BatchStatement(string keySpace, string query, params object[] parameter)
    {
        try
        {
            BatchStatement objBatchStatement = new BatchStatement();
            PreparedStatement statement = PrepareQueryStatement(keySpace, query);
            objBatchStatement.Add(statement.Bind(parameter));
            var session = cluster.Connect(keySpace);
            //objBatchStatement.ConsistencyLevel
            // Execute the batch
            //RowSet row = session.Execute(query);
            RowSet row = session.Execute(objBatchStatement);

        }
        catch (Exception ex)
            {
            Console.WriteLine("Excpetion occured during batch operation method Name BatchStatement error : " + ex.ToString());
        }

    }

我收到错误:批处理中的语句无效:只允许UPDATE、INSERT和DELETE语句。

共有2个答案

魏熠彤
2023-03-14

要回答具体问题...

批处理中的语句无效:仅允许更新、插入和删除语句。

"BEGIN BATCH " +
...
" APPLY BATCH";

< code>BEGIN BATCH和< code>APPLY BATCH是不允许的语句。< code>BatchStatement对象会为您处理这些问题。

至于这种说法:

我得在Cassandra一气呵成插入50000行

João是绝对正确的,因为您正在做的是滥用Cassandra的BATCH功能。BATCH(在Cassandra中)旨在原子地将一次写入应用于多个表。它不是为支持50000次写入一个表而构建的。我见过开发团队在这样做时无意中导致集群节点崩溃。

这不起作用的原因是,卡桑德拉意识到它没有一个单独的分区来发送批处理。因此,它选择一个协调器节点,该节点负责从所有其他节点提取和组合50000个结果。该节点很快就会不堪重负,并崩溃。

同样,João 关于异步编写行的建议是要走的路。我要做的唯一调整是添加一种机制来限制任何时候处于活动状态的线程数,作为保护您的节点免受50k次背压写入的一种方式。

颜文康
2023-03-14

我不太理解您的代码示例,所以我不知道您是否在批处理中使用了< code>SELECT查询,这似乎是问题所在。无论如何,您可能会误用< code>Batch,因为Cassandra中的批处理用于原子性而不是性能(大多数情况下)。

如果您想尽可能快地插入这50000行,那么使用session.ExecuteAsync异步执行50000个插入会更快(并且建议)。尝试这样做:

var tasks = new List<Task>();

foreach (BoundStatement query in queries) 
{
    tasks.Add(session.ExecuteAsync(query));
}

await Task.WhenAll(tasks).ConfigureAwait(false);

对于需要插入更多行的更高级的用例,可能需要控制并发执行的请求数量,但标准任务并行库已经为您完成了其中的一些工作。

批处理比单独异步执行所有这些请求更快的唯一情况是,您可以使用属于同一分区的语句创建微批处理,但这要困难得多,并且很可能不需要这种性能提升。

在您编辑了您的问题后,我可以理解代码示例。如果您仍然想使用Batch而不是我上面建议的方法,那么您要做的是:

var batch = new BatchStatement();
foreach (BoundStatement query in queries) 
{
    batch.Add(query); // you can also add SimpleStatements instead of BoundStatements
}

await session.ExecuteAsync(batch).ConfigureAwait(false);
 类似资料:
  • 在Cassandra中,用于同时执行多个修改语句(插入,更新,删除)。 当你必须更新一些以及删除一些现有的列是非常有用的。 语法 实例: 让我们举个例子来演示命令。 在这里,我们有一个名为“”的表,其中包含列(,,),具有以下数据。 在这个例子中,我们将执行BATCH(插入,更新和删除)操作: 插入一个包含以下信息的新行(,,)。 更新行ID为的学生的列的值为。 删除具有行ID为的雇员的值。 完整

  • 问题内容: 我想使用Hibernate Native SQL在数据库中插入记录。代码如下 上面的代码工作正常,我认为这不是最好的方法。如果有的话,请给我另一种可能的方法。谢谢 问题答案: Hibernate具有批处理功能。但是在以上情况下,我使用的是Native SQL,根据我的观察,hibernate批处理对于Native SQL并不是很有效。是的,可以肯定的是它可以避免内存不足错误,但不会提高

  • 问题内容: 在MS SQL上,我可以使用以下sql命令进行批量插入: 现在我想在MySQL上做同样的事情,但是我似乎无法弄清楚它是如何工作的以及使用什么查询。 问题答案: 在MySQL中,等效项为 加载数据文件 http://dev.mysql.com/doc/refman/5.1/en/load- data.html

  • 问题内容: 我需要通过REST API的Batch端点将大量节点及其之间的关系插入到Neo4j中,大约每秒5k记录(仍在增加)。 这将是24x7连续插入。每条记录可能只需要创建一个节点,而其他记录可能需要两个节点并创建一个关系。 是否可以通过更改程序或修改Neo4j的设置来提高插入件的性能? 到目前为止,我的进度: 1.我已经使用Neo4j进行了一段时间的测试,但无法获得所需的性能 测试服务器盒:

  • 问题内容: 我在使用Mongoskin在Node上执行批量插入(MongoDB 2.6+)时遇到麻烦。 上面的代码给出以下警告/错误: 是否可以使用Mongoskin执行无序批量操作?如果是这样,我在做什么错? 问题答案: 您可以执行此操作,但是您需要更改调用约定才能执行此操作,因为只有“回调”形式实际上会返回可以从其调用方法的集合对象。您认为此用法的方式也存在一些差异: 因此,实际的“批量”方法

  • 问题内容: 我们如何使用雄辩的ORM在Laravel中执行批量数据库插入? 问题答案: 您可以使用。 例如: