web-dev-qa-db-fra.com

Comment insérer plusieurs lignes dans cassandra

Quelle est la manière la plus efficace d'insérer plusieurs lignes dans la famille de colonnes cassandra. Est-il possible de le faire en un seul appel.

À l'heure actuelle, mon approche consiste à ajouter plusieurs colonnes, puis à exécuter. Là, dans un seul appel, je persiste une rangée. Je recherche une stratégie pour pouvoir faire un insert batch.

17
ajjain

CQL contient un BEGIN BATCH...APPLY BATCH instruction qui vous permet de regrouper plusieurs insertions afin qu'un développeur puisse créer et exécuter une série de demandes (voir http://www.datastax.com/dev/blog/client-side-improvements-in- cassandra-2- ).

Ce qui suit a fonctionné pour moi (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));

Si vous ne savez pas à l'avance quelles instructions vous souhaitez exécuter, vous pouvez utiliser la syntaxe suivante (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)

Remarque: BatchStatement ne peut contenir que 65536 instructions. J'ai appris ça à la dure. :-)

25
Priyank Desai

PreparedStatement et les valeurs de liaison peuvent être une meilleure option. Vous trouverez ci-dessous quelques bons articles sur les utilisations et les abus de Batch:

Cassandra: chargement par lots sans le mot clé Batch.

tilisation et mauvaise utilisation des lots

4
user1860447

Il y a une opération d'insertion par lots dans Cassandra. Vous pouvez regrouper des insertions, même dans différentes familles de colonnes, pour rendre l'insertion plus efficace.

Dans Hector, vous pouvez utiliser HFactory.createMutator Puis utiliser les méthodes add sur le mutateur renvoyé pour ajouter des opérations à votre lot. Lorsque vous êtes prêt, appelez execute().

Si vous utilisez CQL, vous regroupez les choses dans un lot en commençant le lot par BEGIN BATCH Et en terminant par APPLY BATCH.

3
Richard

vous pouvez ajouter vos multiples instructions d'insertion dans un fichier et exécuter le fichier avec 'cqlsh -f'.

Vous pouvez également effectuer une insertion par lots avec CQL dans cassandra comme décrit dans le lien ci-dessous: http://www.datastax.com/documentation/cassandra/1.2/index.html#cassandra /cql_reference/batch_r.html

1
eldho

Lorsque vous essayez d'insérer plusieurs lignes. La connexion à la base de données RTT pourrait être le goulot d'étranglement des performances. Dans ce cas, nous avons généralement besoin d'un moyen pour éviter d'attendre la fin d'un INSERT afin de pouvoir commencer notre prochain INSERT. Actuellement, il y a deux façons pour autant que je sache:

  • Si la cohérence des données est importante, utilisez LOGGED BATCH, mais comme cette question l'a dit, BATCH peut ne pas avoir une amélioration des performances dans toutes les situations.
  • Sinon, utilisez une API asynchrone dans la bibliothèque cliente Cassandra, par exemple dans python il y a un execute_async méthode

Vous pouvez également préparer l'instruction SQL avant de l'exécuter. Je n'ai pas testé les performances globales d'une instruction préparée par rapport à un insert simple. Mais je pense que s'il y a des milliers INSERT ou plus, vous devriez obtenir une amélioration des performances.

0
rpstw