Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Insert 如何在cassandra中多插入行_Insert_Cassandra_Batch Insert - Fatal编程技术网

Insert 如何在cassandra中多插入行

Insert 如何在cassandra中多插入行,insert,cassandra,batch-insert,Insert,Cassandra,Batch Insert,在cassandra列族中插入多行的最有效方法是什么。是否可以在一次呼叫中完成此操作 现在我的方法是添加多列,然后执行。在一次呼叫中,我坚持一行。我正在寻找一种策略,这样我可以进行批量插入。您可以将多个插入语句添加到一个文件中,并使用“cqlsh-f”执行该文件 您还可以使用CQL将批插入cassandra,如下链接所述: Cassandra中有一个批插入操作。即使在不同的列族中,也可以将插入内容批处理在一起,以提高插入效率 在Hector中,您可以使用HFactory.createMutato

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


现在我的方法是添加多列,然后执行。在一次呼叫中,我坚持一行。我正在寻找一种策略,这样我可以进行批量插入。

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

您还可以使用CQL将批插入cassandra,如下链接所述:
Cassandra中有一个批插入操作。即使在不同的列族中,也可以将插入内容批处理在一起,以提高插入效率

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


如果您使用的是CQL,那么您可以通过以
BEGIN batch
开始批处理,以
APPLY batch
结束批处理,将内容分组到一个批处理中。CQL包含一个
BEGIN batch…APPLY batch
语句,允许您对多个插入进行分组,以便开发人员可以创建和执行一系列请求 (见附件)

以下内容对我很有用(Scala):

PreparedStatement ps=session.prepare(
“开始批处理”+
“在消息(用户id、消息id、标题、正文)中插入值(?,?,?);”+
“在消息(用户id、消息id、标题、正文)中插入值(?,?,?);”+
“在消息(用户id、消息id、标题、正文)中插入值(?,?,?);”+
“申请批次”);
执行(ps.bind(uid,mid1,title1,body1,uid,mid2,title2,body2,uid,mid3,title3,body3));
如果您事先不知道要执行哪些语句,可以使用以下语法(Scala):

var语句:PreparedStatement=session.prepare(“插入人(姓名、年龄)值(?,)”)
var boundStatement=新的boundStatement(语句)
val batchStmt=new BatchStatement()
batchStmt.add(boundStatement.bind(“用户A”、“10”))
batchStmt.add(boundStatement.bind(“用户B”、“12”))
session.execute(batchStmt)

注意:
BatchStatement
最多只能容纳65536条语句。我通过艰苦的方式学会了这一点。:-)

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


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

  • 如果数据一致性很重要,请使用
    记录的批处理
    ,但如上所述,
    批处理
    可能不会在所有情况下提高性能
  • 否则,请在Cassandra客户端库中使用异步api,例如在python中有一个
    execute\u async
    方法

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

您使用的是哪种驱动程序?你在用CQL吗?哪一个Cassandra版本?Cassandra版本是1.2.x,我使用的是hector API。请确保您理解这是一个好主意,什么时候是一个好主意。批处理通常不会提高性能,在最坏的情况下甚至会降低性能。如果您不需要原子写入,请确保使用未标记的批处理。这一点很好。我认为成批的节约几乎总是有帮助的(因为节约的巨大开销)。在CQL中,应该使用异步插入和准备好的语句,而不是批处理。除了插入都在同一分区的情况,在这种情况下,批处理效率更高。@user853509这是一个帮助您的“很好的答案”,甚至不是一个向上投票?严厉,回答得好。加上我的一条。我一次可以发送多少insert语句?在Scala示例中,所有
var
s应该是
val
s。对象引用不会更改。后一个版本对我不起作用。必须将每个
boundStatement.bind(…)
替换为
新的boundStatement(statement)。bind(…)
能否修复上面的Datastax URL?现在返回404。