19

カサンドラ列ファミリーに複数の行を挿入する最も効率的な方法は何ですか? 1 回の呼び出しでこれを行うことは可能ですか。

現在、私のアプローチは、複数の列を挿入してから実行することです。1回の呼び出しで、1行を保持しています。バッチ挿入を行うための戦略を探しています。

4

5 に答える 5

35

CQL にはBEGIN BATCH...APPLY BATCH、開発者が一連のリクエストを作成して実行できるように、複数の挿入をグループ化できるステートメントが含まれています ( http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2を参照)。 -0 )。

以下は私のために働いた(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));

実行するステートメントが事前にわからない場合は、次の構文 (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)

注: BatchStatement 65536 ステートメントまでしか保持できません。私はそれを難し​​い方法で学びました。:-)

于 2015-07-15T01:26:53.927 に答える
6

PreparedStatement とバインディングの値は、より適切なオプションである可能性があります。以下は、Batch の使用と誤用に関するいくつかの優れた記事です。

Cassandra: Batch キーワードなしのバッチ読み込み。

バッチの使用と誤用

于 2015-09-23T16:31:15.387 に答える
3

Cassandra には一括挿入操作があります。異なる列ファミリーであっても、挿入をまとめてバッチ処理して、挿入をより効率的にすることができます。

Hector では、返された MutatorHFactory.createMutatorのメソッドを使用して、操作をバッチに追加できます。add準備ができたら、 に電話してexecute()ください。

CQL を使用している場合は、バッチを で開始してBEGIN BATCHで終了することにより、物事をバッチにグループ化しAPPLY BATCHます。

于 2013-07-27T08:10:17.123 に答える