2013-07-26 9 views
6

Qual è il modo più efficace di inserire più righe nella famiglia di colonne cassandra. È possibile farlo in una singola chiamata.Come inserire più righe in cassandra

In questo momento il mio approccio consiste nell'aggiungere più colonne e quindi eseguirle. Lì in una sola chiamata sto persistendo una riga. Sto cercando una strategia in modo da poter inserire un batch.

+0

Quale driver stai usando? Stai usando CQL? Quale versione di Cassandra? – Richard

+0

La versione di Cassandra è 1.2.2x e sto usando hector apis. – ajjain

risposta

3

C'è un'operazione di inserimento dei lotti a Cassandra. È possibile raggruppare insieme inserti, anche in famiglie di colonne diverse, per rendere l'inserimento più efficiente.

In Hector, è possibile utilizzare HFactory.createMutator quindi utilizzare i metodi add sul Mutator restituito per aggiungere operazioni al batch. Quando sei pronto, chiama il numero execute().

Se si utilizza CQL, si raggruppano gli elementi in un batch avviando il batch con BEGIN BATCH e terminando con APPLY BATCH.

+3

Assicurati di capire quando questa è una buona idea e [quando non lo è] (http://docs.datastax.com/en/cql/3.1/cql/cql_using/useBatch.html). I batch generalmente non migliorano le prestazioni e possono addirittura ridurli nel peggiore dei casi. Se non hai bisogno di scritture atomiche, assicurati di utilizzare un batch non loggato. –

+1

Buon punto. Penso che i lotti di risparmio abbiano quasi sempre aiutato (a causa del massiccio sovraccarico del risparmio). In CQL, è necessario utilizzare inserimenti asincroni e istruzioni preparate anziché batch. Tranne il caso in cui i tuoi inserti sono tutti sulla stessa partizione, nel qual caso i lotti sono più efficienti. – Richard

12

CQL viene fornito con un'istruzione BEGIN BATCH ... APPLY BATCH che consente di raggruppare più inserti, in modo che uno sviluppatore possa creare una stringa di tale richiesta batch ed eseguirla. [http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0]

Di seguito ha lavorato per me:

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)); 

Se non si conosce in anticipo ciò che le dichiarazioni che si desidera eseguire, è possibile utilizzare la seguente sintassi (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) 

Nota: BatchStatement può contenere fino a 65536 istruzioni. Ho imparato questo nel modo più duro. :-)

+1

Ottima risposta! Funziona anche per me! – capcom923

+0

@ user853509 Una "ottima risposta" che ti ha aiutato, e nemmeno un upvote? Harsh. – Aaron

+0

Buona risposta. Più uno da me. – Aaron