web-dev-qa-db-ja.com

cassandraに行を複数挿入する方法

cassandra列ファミリーに複数の行を挿入する最も効率的な方法は何ですか。これを単一の呼び出しで行うことは可能ですか?.

現在、私のアプローチは複数の列を追加して実行することです。 1回の呼び出しで、1つの行を保持しています。バッチ挿入ができるように戦略を探しています。

17
ajjain

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

以下は私のために働きました(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個のステートメントしか保持できません。私はその難しい方法を学びました。 :-)

25
Priyank Desai

PreparedStatementと値のバインドは、より良いオプションかもしれません。以下は、Batchの使用法と誤用に関する優れた記事です。

Cassandra:Batchキーワードを使用しないバッチロード。

バッチの使用と誤用

4
user1860447

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

Hectorでは、_HFactory.createMutator_を使用してから、返されたMutatorでaddメソッドを使用して、バッチに操作を追加できます。準備ができたら、execute()を呼び出します。

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

3
Richard

複数の挿入ステートメントをファイルに追加し、「cqlsh -f」を使用してファイルを実行できます。

また、CQLを使用してcassandraに以下のリンクで説明されているようにバッチ挿入を実行することもできます。 http://www.datastax.com/documentation/cassandra/1.2/index.html#cassandra /cql_reference/batch_r.html

1
eldho

複数の行を挿入しようとしたとき。データベース接続RTTは、パフォーマンスのボトルネックになる可能性があります。その場合、通常、次のINSERTを開始できるように、1つのINSERTが完了するのを待たないようにする方法が必要です。現在、私が知る限り、2つの方法があります。

  • データの整合性が重要な場合は、LOGGED BATCH、しかし この質問 が述べたように、BATCHはすべての状況でパフォーマンスを向上させるとは限りません。
  • それ以外の場合は、Cassandraクライアントライブラリで非同期APIを使用します。たとえば、pythonでexecute_async 方法

また、SQL文を実行する前に準備できます。準備されたステートメントと単純な挿入の全体的なパフォーマンスをテストしていません。しかし、何千もINSERT以上あれば、パフォーマンスが向上するはずです。

0
rpstw