2017-06-05 140 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) 
相關問題