在cassandra列族中插入多行的最有效方法是什么。是否可以通过一次通话完成此操作。
现在我的方法是添加多个列然后执行。在一个电话中,我坚持一行。我正在寻找策略,以便我可以进行批量插入。
答案 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的使用和误用的几篇好文章:
答案 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
可能不会在所有情况下都提高性能。execute_async
方法此外,您可以在执行之前准备SQL语句。我还没有测试预准备语句与普通插入语句的整体性能。但是我认为,如果有成千上万的{{1}},您应该可以提高性能。