如何在cassandra中多次插入行

时间:2013-07-26 15:22:21

标签: insert cassandra batch-insert

在cassandra列族中插入多行的最有效方法是什么。是否可以通过一次通话完成此操作。

现在我的方法是添加多个列然后执行。在一个电话中,我坚持一行。我正在寻找策略,以便我可以进行批量插入。

5 个答案:

答案 0 :(得分:16)

CQL包含BEGIN BATCH...APPLY BATCH语句,允许您对多个插入进行分组,以便开发人员可以创建和执行一系列请求 (见http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0)。

以下为我工作(Scala):

PreparedStatement ps = session.prepare(
"BEGIN BATCH" +    
"INSERT INTO messages (user_id, msg_id, title, body) VALUES (?, ?, ?, ?);" +    
"INSERT INTO messages (user_id, msg_id, title, body) VALUES (?, ?, ?, ?);" +    
"INSERT INTO messages (user_id, msg_id, title, body) VALUES (?, ?, ?, ?);" +    
"APPLY BATCH" ); 

session.execute(ps.bind(uid, mid1, title1, body1, uid, mid2, title2, body2, uid, mid3, title3, body3));

如果您事先不知道要执行哪些语句,可以使用以下语法(Scala):

var statement: PreparedStatement = session.prepare("INSERT INTO people (name,age) VALUES (?,?)")
var boundStatement = new BoundStatement(statement)
val batchStmt = new BatchStatement()
batchStmt.add(boundStatement.bind("User A", "10"))
batchStmt.add(boundStatement.bind("User B", "12"))
session.execute(batchStmt)

注意: BatchStatement最多只能容纳65536个语句。我学到了很难的方法。 : - )

答案 1 :(得分:4)

PreparedStatement和绑定值可能是更好的选择。以下是关于Batch的使用和误用的几篇好文章:

Cassandra: Batch loading without the Batch keyword.

Using and misusing batches

答案 2 :(得分:3)

Cassandra中有一个批量插入操作。即使在不同的列族中,您也可以将插入一起批量处理,以提高插入效率。

在Hector中,您可以使用HFactory.createMutator,然后使用返回的Mutator上的add方法向批处理添加操作。准备好后,请致电execute()

如果您正在使用CQL,则可以通过以BEGIN BATCH开始并以APPLY BATCH结尾的批处理将事物分组到批处理中。

答案 3 :(得分:1)

您可以将多个insert语句添加到文件中,并使用'cqlsh -f'执行该文件。

您还可以使用CQL将批量插入执行到cassandra中,如下面的链接所述: http://www.datastax.com/documentation/cassandra/1.2/index.html#cassandra/cql_reference/batch_r.html

答案 4 :(得分:0)

尝试插入多行时。数据库连接RTT可能是性能瓶颈。在这种情况下,我们通常需要一种避免等待一个INSERT完成的方法,以便我们可以开始下一个INSERT。据我所知,目前有两种方法:

  • 如果数据一致性很重要,请使用LOGGED BATCH,但是正如this question所说,BATCH可能不会在所有情况下都提高性能。
  • 否则,请在Cassandra客户端库中使用异步api,例如在python中,有一种execute_async方法

此外,您可以在执行之前准备SQL语句。我还没有测试预准备语句与普通插入语句的整体性能。但是我认为,如果有成千上万的{{​​1}},您应该可以提高性能。