如何在 cassandra 中多插入行

Posted

技术标签:

【中文标题】如何在 cassandra 中多插入行【英文标题】:How to multi insert rows in cassandra 【发布时间】:2013-07-26 22:52:02 【问题描述】:

在 cassandra 列族中插入多行的最有效方法是什么。是否可以在一次调用中执行此操作。

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

【问题讨论】:

您使用的是哪个驱动程序?你在使用 CQL 吗?哪个 Cassandra 版本? Cassandra 版本是 1.2.x,我使用的是 hector apis。 【参考方案1】:

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 条语句。我很难学到这一点。 :-)

【讨论】:

@user853509 一个对您有帮助的“好答案”,甚至没有投票?苛刻。 好答案。加我一个。 一次可以发送多少条插入语句? 在 Scala 示例中,所有vars 都应该是vals。对象引用不会改变。 后一个版本对我不起作用。必须将每个 boundStatement.bind(...) 替换为 new BoundStatement(statement).bind(...)【参考方案2】:

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

Cassandra: Batch loading without the Batch keyword.

Using and misusing batches

【讨论】:

【参考方案3】:

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

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

如果您使用的是 CQL,则可以通过以 BEGIN BATCH 开头并以 APPLY BATCH 结尾的方式将事物分组到一个批次中。

【讨论】:

确保你明白什么时候这是个好主意,when it isn't。批处理通常不会提高性能,甚至可以在最坏的情况下降低性能。如果您不需要原子写入,请确保使用未记录的批处理。 好点。我认为在节俭的批次中几乎总是有帮助(因为节俭的大量开销)。在 CQL 中,您应该使用异步插入和准备好的语句而不是批处理。除了插入都在同一个分区的情况,在这种情况下批处理效率更高。【参考方案4】:

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

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

【讨论】:

你能修复上面的Datastax URL吗?它现在返回 404。【参考方案5】:

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

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

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

【讨论】:

以上是关于如何在 cassandra 中多插入行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Column 中插入没有空值的 Cassandra

cassandra中多表ACID事务的解决方法是啥

如何在 cassandra 中捕获条件插入的返回值?

如何在cassandra cql的一行插入中插入多行?

如何在 Python Cassandra 中获取最后插入的 id?

CQL Cassandra - 如何在插入或更新中使用 SELECT 结果