繁体   English   中英

如何在cassandra中多行插入

[英]How to multi insert rows in cassandra

在 cassandra 列族中插入多行的最有效方法是什么。 是否可以在一次调用中做到这一点。

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

CQL 包含一个BEGIN BATCH...APPLY BATCH语句,它允许您对多个插入进行分组,以便开发人员可以创建和执行一系列请求(请参阅http://www.datastax.com/dev/blog/client-side- 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 条语句。 我学会了艰难的方式。 :-)

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

Cassandra:没有 Batch 关键字的批量加载。

使用和误用批次

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

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

如果您使用的是 CQL,那么您可以通过以BEGIN BATCH开始批处理并以APPLY BATCH结束来将事物分组到一个批处理中。

您可以将多个插入语句添加到一个文件中,并使用“cqlsh -f”执行该文件。

您还可以按照以下链接中的说明使用 CQL 执行批量插入到 cassandra 中: http : //www.datastax.com/documentation/cassandra/1.2/index.html#cassandra/cql_reference/batch_r.html

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

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

此外,您可以在执行之前准备 SQL 语句。 我还没有测试准备好的语句与普通插入的整体性能。 但我认为如果有数千个INSERT或更多,您应该获得性能提升。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM