2017-06-05 6 views
2

J'insère et met à jour plusieurs entrées dans une table dans Cassandra en utilisant le pilote python Cassandra. À l'heure actuelle mon code ressemble à:le moyen le plus rapide d'insérer dans cassandra en utilisant le pilote python 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)) 

Cette méthode d'insertion et de mise à jour est assez lent que le nombre d'entrées dans la liste (tous sont uniques) qui sont à insérer est très grande. Y a-t-il un moyen plus rapide de le faire?

+1

utilisation '. Méthode Session.execute_async' avec préparation d déclaration –

+0

d'où provient bool'? c'est un nom de classe intégré, ne l'utilisez pas pour vos objets –

+0

@AzatIbrakov execute_async() exécute-t-il les requêtes dans l'ordre? Si c'est le cas, alors je peux exécuter de nombreuses requêtes en utilisant execute_async() et juste appeler result() sur l'objet ResponseFuture retourné par le dernier appel à session.execute_async(), n'est-ce pas? Si non, alors que dois-je faire pour m'assurer que toutes les requêtes ont été exécutées (c'est-à-dire que toutes les insertions sont terminées)? –

Répondre

0

Généralement, pour ce scénario, vous obtiendrez les meilleures performances en augmentant le nombre d'écritures simultanées sur Cassandra.

Vous pouvez le faire avec le pilote DataStax Python Cassandra utilisant execute_concurrent

D'après votre description, il convient de noter que, pour votre cas, il n'y a pas de différence entre un Update et un Insert avec Cassandra. (Vous pouvez simplement faire la déclaration d'insertion de votre clause else pour toutes les valeurs de (a, b).

Vous voulez créer une déclaration préparée.

Plutôt que de faire les inserts, un à la fois votre boucle for, considérer les groupes pré-calcul de (a, b) des paires en entrée pour execute_concurrent, on peut également écrire un générateur ou l'expression générateur comme entrée pour execute_concurrent

Exemple:

parameters = ((a, calculate_b(a)) for a in my_list) 
execute_concurrent_with_args(my_session, my_prepared_statement, parameters)