2013-07-26 2 views
6

Каков наиболее эффективный способ вставки нескольких строк в семейство столбцов cassandra. Возможно ли это сделать за один раз.Как много вставлять строки в cassandra

Прямо сейчас мой подход заключается в добавлении нескольких столбцов и последующем выполнении. Там за один звонок я упорствую в одном ряду. Я ищу стратегию, чтобы я мог делать пакетную вставку.

+0

Какой драйвер вы используете? Вы используете CQL? Какая версия Кассандры? – Richard

+0

Cassandra version is1.2.x, и я использую hector apis. – ajjain

ответ

3

Существует операция пакетной вставки в Кассандре. Вы можете совмещать вставки, даже в разных семействах столбцов, чтобы сделать вставку более эффективной.

В Hector вы можете использовать HFactory.createMutator, затем используйте методы add на возвращаемом Мутаторе, чтобы добавить операции в вашу партию. Когда будете готовы, звоните execute().

Если вы используете CQL, то вы группируете вещи в партию, начиная партию с BEGIN BATCH и заканчивая APPLY BATCH.

+3

Убедитесь, что вы понимаете, когда это хорошая идея, и [когда это не так) (http://docs.datastax.com/ru/cql/3.1/cql/cql_using/useBatch.html). Пакеты обычно не улучшают производительность и даже могут уменьшить ее в худшем случае. Если вам не нужны атомные записи, убедитесь, что вы используете немаркированную партию. –

+1

Хорошая точка. Я думаю, что в экономных партиях почти всегда помогали (из-за огромных накладных расходов). В CQL вы должны использовать асинхронные вставки и подготовленные операторы, а не партии. За исключением случая, когда ваши вставки все относятся к одному и тому же разделу, и в этом случае партии более эффективны. – Richard

12

В CQL имеется инструкция BEGIN BATCH ... APPLY BATCH, которая позволяет группировать несколько вставок, чтобы разработчик мог построить строку такого пакетного запроса и выполнить ее. [http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0]

Следующая работал для меня:

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. Узнал это трудно. :-)

+1

Отличный ответ! Это работает и для меня! – capcom923

+0

@ user853509 «Отличный ответ», который помог вам, и даже не поднять? Суровая. – Aaron

+0

Хороший ответ. Плюс один от меня. – Aaron

Смежные вопросы