カサンドラ列ファミリーに複数の行を挿入する最も効率的な方法は何ですか? 1 回の呼び出しでこれを行うことは可能ですか。
現在、私のアプローチは、複数の列を挿入してから実行することです。1回の呼び出しで、1行を保持しています。バッチ挿入を行うための戦略を探しています。
カサンドラ列ファミリーに複数の行を挿入する最も効率的な方法は何ですか? 1 回の呼び出しでこれを行うことは可能ですか。
現在、私のアプローチは、複数の列を挿入してから実行することです。1回の呼び出しで、1行を保持しています。バッチ挿入を行うための戦略を探しています。
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 ステートメントまでしか保持できません。私はそれを難しい方法で学びました。:-)
PreparedStatement とバインディングの値は、より適切なオプションである可能性があります。以下は、Batch の使用と誤用に関するいくつかの優れた記事です。
Cassandra には一括挿入操作があります。異なる列ファミリーであっても、挿入をまとめてバッチ処理して、挿入をより効率的にすることができます。
Hector では、返された MutatorHFactory.createMutator
のメソッドを使用して、操作をバッチに追加できます。add
準備ができたら、 に電話してexecute()
ください。
CQL を使用している場合は、バッチを で開始してBEGIN BATCH
で終了することにより、物事をバッチにグループ化しAPPLY BATCH
ます。