2017-06-05 80 views
2

我使用python Cassandra驱动程序将多个项插入并更新到Cassandra中的表中。目前我的代码看起来像:使用python cassandra驱动程序插入cassandra的最快方法

cluster = Cluster() 
session = cluster.connect('db') 
for a in list: 
    if bool: 
     # calculate b 
     session.execute("UPDATE table SET col2 = %s WHERE col1 = %s", (b, a)) 
    else: 
     # calculate b 
     session.execute("INSERT INTO table(col1, col2) VALUES(%s, %s)", (a, b)) 

插入和更新的这种方法是(都是唯一的)在列表中的条目数将被插入是非常大的很慢。有没有更快的方法来做到这一点?

+1

使用'。 Session.execute_async'方法与准备d语句 –

+0

哪里'bool'从哪里来?它是一个内置的类名,不要将它用于你的对象 –

+0

@AzatIbrakov执行execute_async()按顺序执行查询?如果是这样,那么我可以使用execute_async()来执行很多查询,并且只需要调用最后一次调用session.execute_async()所返回的ResponseFuture对象上的result(),对吧?如果不是,那么我应该怎么做以确保所有查询都已执行(即所有插入已完成)? –

回答

0

通常在这种情况下,您将通过增加并发写入Cassandra的数量来看到最佳性能。

您可以使用execute_concurrent

从你的描述的Datastax Python的卡桑德拉司机做到这一点,值得注意的是,对于你的情况有一个UpdateInsert与卡桑德拉之间没有什么区别。 (例如,你可以简单地做INSERT语句从其他子句的所有值(A,B)。

您将要创建一个事先准备好的声明。

而不是在一个时间做插入一个您的for循环,考虑预先计算的(A,b)对作为输入来execute_concurrent基团;还可以写一个发电机或发电机表达式作为输入用于execute_concurrent

实施例:

parameters = ((a, calculate_b(a)) for a in my_list) 
execute_concurrent_with_args(my_session, my_prepared_statement, parameters) 
相关问题