2014-04-18 16 views
6

kullanarak cassandra tamsayı sütun: Ben cassandra CQL içinde bunu nasılgüncelleme ben bir tablo aşağıda belirtildiği gibi Cassandra'ya 'değerlendirmeleri' olan CQL

CREATE TABLE reviews (
    review_id text, 
    downcount int, 
    upcount int, 
    creation_date timestamp, 
    PRIMARY KEY (review_id) 
) 

Let Ben 1 ile Yukarı doğru sayma değerini güncellemek istiyorum demek, . Yaparsam ,

update reviews set upcount = upcount +1 where review_id='123456'; 

Bana aşağıdaki hatayı

Bad Request: Invalid operation (upcount = upcount + 1) for non counter column upcount 

cevap

18

Cassandra'nın sayaç sütunları veri türünü kullanabilirsiniz. Sayaç olmayan sütunlar kompozit PRIMARY KEY'un bir parçası değilse, aynı sütun ailesindeki sayaç olmayan sütunlarla sayaç sütunlarını karıştıramayacağınızı unutmayın. Böylece, sayaçları reviews_counts, başka bir sütun ailesine ayırmanız gerekir.

CREATE TABLE reviews (
    review_id text, 
    creation_date timestamp, 
    PRIMARY KEY (review_id) 
) 

CREATE TABLE reviews_counts (
    review_id text, 
    downcount counter, 
    upcount counter, 
    PRIMARY KEY (review_id) 
) 

Şimdi arttırma ifadesi çalışmalıdır.

UPDATE keyspace.reviews_counts 
SET upcount = upcount + 1 
WHERE review_id=123456 

Burada, Cassandra sayaç sütunlarıyla ilgili daha fazla belge bulunmaktadır. http://www.datastax.com/documentation/cql/3.0/cql/cql_using/use_counter_t.html

+0

Sayaçları biliyordum ve sadece bundan kaçınmak ve herhangi bir alternatif olup olmadığını görmek istedim.Ayways, gidip bunu kullanacak. Cevabınız için teşekkürler. – tushR

+0

Cassandra hakkında bir başka naif soru, inceleme_sayısı tablosunda review_id olarak tanımlanmış birincil anahtarı tanımlamış olduğunuz gibi, bu sütun ailesinde sütun bulunmayan bir birincil anahtar tanımlamanız mümkün. – tushR

+1

Buna inanmıyorum. SQL'e benzer şekilde, yabancı anahtarın abc tablosunda gerçekte yer almadan abc tablosundaki bir yabancı anahtarı kullanamazsınız. Ayrıca Cassandra, ana anahtardan yola çıkarak kümedeki verileri düzenler/çoğaltır, dolayısıyla sütun ailesinde bulunması gerekeceğini varsayardım. – cevaris

6

Sen bunu yapamazsın verir. Sütunu okumalı, uygulama tarafında değeri güncellemeli ve güncellenmiş değeri atamalısınız. Hatadan da anlaşılacağı gibi, sadece sayaç sütunları cassandra'da bu özelliği desteklemektedir.

Nedeni basittir. Sayaçlar dağıtılan düğümler arasında senkronize edilir. Cassandra, nihai tutarlılığı sağladığından, tezgah olmayan sütunlardaki güncellemeler, sunucu tarafında bir yarış durumu oluşturabilir.

+1

Evet Uygulama tarafında değeri güncellemekten kaçınmak istedim, çünkü bu veritabanı için ekstra bir sorgu olacaktır.Ayrıca tutarlılık hakkında yararlı bilgiler sağladığınız için teşekkürler. – tushR

İlgili konular