2013-03-21 62 views
0

有没有一种方法可以使用列家族模板更新cassandra数据库中的多行,如提供一个键列表。 当前我正在使用updater columnFamilyTemplate来遍历一个键的列表并为每一行进行更新。我看到过像multigetSliceQuery这样的查询,但我不知道它们在进行更新时的等价性。如何使用Hector更新多行

回答

0

ColumnFamilyTemplate中没有实用方法,只允许您在一个调用中传递带有突变列表的键列表。 你可以使用mutators来实现你自己的。

这是如何做到这一点的赫克托

Set<String> keys = MY_KEYS; 
Map<String, String> pairsOfNameValues = MY_MUTATION_BY_NAME_AND_VALUE; 

Set<HColumn<String, String>> colums = new HashSet<HColumn<String,String>>(); 
for (Entry<String, String> pair : pairsOfNameValues.entrySet()) { 
    colums.add(HFactory.createStringColumn(pair.getKey(), pair.getValue())); 
} 

Mutator<String> mutator = template.createMutator(); 
String column_family_name = template.getColumnFamily(); 
for (String key : keys) { 
    for (HColumn<String, String> column : colums) { 
     mutator.addInsertion(key, BASIC_COLUMN_FAMILY, column); 
    } 
} 
mutator.execute(); 

那么它应该是一个基本的代码。这是插入一个例子,一定要使用下面的方法进行批量突变:

mutator.addInsertion 
mutator.addDeletion 
mutator.addCounter 
mutator.addCounterDeletion 

因为这样的会马上执行,而不必等待mutator.execute():

mutator.incrementCounter 
mutator.deleteCounter 
mutator.insert 
mutator.delete 

由于最后一个注意事项:一个增变器可以让你一次对多个列族的多行进行批处理变异......这就是为什么我通常更喜欢用它们代替CF模板的原因。对于使用NoSQL的“push-on-write”模式的功能,我有很多反规范化功能。

+0

我想要澄清一点:如果我想删除多行,那么我应该先获取键列表,然后尝试逐个删除每一行键。或者有其他方式可以删除多行。因为这个场景就像我不知道行键(因为它随机生成),但我知道电子邮件或每行的某个特定列值。 – manish 2013-05-09 05:22:10

+0

你应该看一看Reddit的内容......他们在Board/Message/Comment类型的数据中处于使用Cassandra的最前沿。我宁愿使用couchbase/bigcouch/couchdb。使用cassandra的挑战性部分是摆脱“读 - 修改 - 写”,并将任何修改写入cass。 – 2013-05-09 10:20:09

+0

如果您要将您最后的评论发布为问题,我认为这对我们很多人来说是一个有趣的练习。 – 2013-05-09 10:22:34

-1

您可以使用批量突变来尽可能多地插入(在thrift_max_message_length_in_mb内)。见http://hector-client.github.com/hector//source/content/API/core/1.0-1/me/prettyprint/cassandra/model/MutatorImpl.html

+0

我认为你提到节俭的最大尺寸是很重要的,因为如果你不小心,它会丢失连接。所以+1 – 2013-05-09 10:23:35

+0

嗨理查德,你能否阐述节俭的最大规模和失去联系。我一直没有暗示最大尺寸,我需要知道我应该采取什么样的照顾。 – qualebs 2013-05-16 20:45:39