2015-04-22 19 views
13

Cassandra'larla yeniyim ve bir sorunla karşılaştım. Bir keyspace demodb ve bir masa kullanıcısı oluşturdum. Bu tabloda 3 sütun var: id (int ve birincil anahtar), firstname (varchar), name (varchar).cassandra, birincil olmayan bir anahtarla seçin

SELECT * FROM demodb.users WHERE id = 3; 

ama bu bir: bu istek bana iyi bir sonuç göndermek

SELECT * FROM demodb.users WHERE firstname = 'francois'; 

çalışmıyor ve aşağıdaki hata mesajı alıyorum:

InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: " 

Bu istek de gelmez 't çalışması:

SELECT * FROM users WHERE firstname = 'francois' ORDER BY id DESC LIMIT 5; 
InvalidRequest: code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported." 

Şimdiden teşekkürler.

cevap

12

Bu istek de çalışmaz: Eğer yanlış anlama sıralama düzeni Cassandra'ya nasıl çalıştığını çünkü var

. Bunun yerine firstname ikincil indeks kullanmak yerine, bu gibi bu sorgu için özel bir tablo oluşturmak:

CREATE TABLE usersByFirstName (
    id int, 
    firstname text, 
    lastname text, 
    PRIMARY KEY (firstname,id)); 

Bu sorgu şimdi çalışmalı:

SELECT * FROM usersByFirstName WHERE firstname='francois' 
ORDER BY id DESC LIMIT 5; 

Not, bir bileşik birincil anahtar oluşturduk firstname ve id. Bu, verilerinizi id ile kümeleştirirken, verilerinizi firstname (sizin tarafınızdan sorgulanmanızı sağlar) üzerinde bölümlendirir. Varsayılan olarak, verileriniz artan sırada id tarafından kümelenecektir.

WITH CLUSTERING ORDER BY (id DESC) 

... sonra bile bir ORDER BY maddesi gerekmez: Bu davranışı değiştirmek için, tablo oluşturma açıklamada bir CLUSTERING ORDER belirtebilirsiniz.

Geçenlerde kümeleme sırası Cassandra (We Shall Have Order) nasıl çalıştığı hakkında bir yazı yazdım. Bunu açıklıyor ve bazı sipariş stratejilerini de kapsamaktadır. Her iki istek için

+0

Bu bilgiler için çok teşekkürler – mel

5

cassandra bir kısıtlama yoktur: Herhangi alan, fıkra tablonun birincil anahtar olmak zorunda ya da üzerinde ikincil bir dizin olmalıdır nerede kullanmak istiyorum. Bu yüzden, bir firstname için bir indeks oluşturmalısınız ve bundan sonra, nerede isminde firstname kullanabilir ve beklediğiniz sonucu alacaksınız.

+0

? Önceden birincil anahtar verdiğiniz için – mel

+0

. sadece firstname için dizin oluştur. –

+1

Ben firstname için indeksi oluşturdum ve şimdi: SELECT * FROM demodb.users WHERE firstname = 'francois'; iş ama ELEKTRIK * FROM kullanıcıları WHERE firstname = 'francois' SİPARİŞİNİN İDDİASI BY DESC LIMIT 5; hala çalışmıyor. – mel

İlgili konular