2013-03-21 24 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

相關問題