2013-10-17 66 views
0

我是cassandra的新手。我有一個複合主鍵的表。該表的描述是cassandra cql查詢條件在rowkey和聚類列

CREATE TABLE testtable (
    foid bigint, 
    id bigint, 
    severity int, 
    category int, 
    ack boolean, 
    PRIMARY KEY (foid, id, severity, category) 
) WITH 
    bloom_filter_fp_chance=0.010000 AND 
    caching='KEYS_ONLY' AND 
    comment='' AND 
    dclocal_read_repair_chance=0.000000 AND 
    gc_grace_seconds=864000 AND 
    index_interval=128 AND 
    read_repair_chance=0.100000 AND 
    replicate_on_write='true' AND 
    populate_io_cache_on_flush='false' AND 
    default_time_to_live=0 AND 
    speculative_retry='NONE' AND 
    memtable_flush_period_in_ms=0 AND 
    compaction={'class': 'SizeTieredCompactionStrategy'} AND 
    compression={'sstable_compression': 'LZ4Compressor'}; 

我的要求是,我需要查詢與foid表,在條件和id與範圍的條件和severity與條件

所以,當我試圖下面的查詢

select * from testtable where foid in (5,6) and id>10 and severity in (5); 

我得到了錯誤消息作爲

select * from testtable where(5,6)and id> 10 and severity in(5);

或甚至severity列上的相等條件對我來說就足夠了,這也不起作用。

有什麼辦法,同樣可以實現

我與二級指標受審severitycategory過,但這並沒有給我任何積極。

回答

1

您需要先後限制主鍵,所以下面的工作:

select * from testtable where foid in (1) and id=2 and severity<20 ; 

但這不會:

select * from testtable where foid in (1) and id>10 and severity=3; 

什麼使得查詢較少限制(如你所說在你的問題)如下

​​

並在客戶端排序結果?

的替代(也可能是更有吸引力)的解決方案是根據你將如何執行查詢,如訂購你的鑰匙,

CREATE TABLE testtable2 (
    foid bigint, 
    severity int, 
    id bigint, 
    category int, 
    ack boolean, 
    PRIMARY KEY (foid, severity, id, category) 
) 

讓您進行查詢,像這樣(注意平等操作上severity,上severity一個IN操作將不能正常工作):

select * from testtable2 where foid in (5,6) and severity=5 and id>10; 

(與CQL測試[4.0.1 cqlsh |卡桑德拉2.0.1 | CQL規格3.1.1 |節儉協議19.37.0])

+0

我也曾經想過和你描述的一樣。而且最後的解決方案本身也適用於某些場景。由於過濾的嚴重性列包括在內,因此是動態的。有情況我不會使用嚴重性列。任何如你所說,我試圖執行查詢限制foid和id和排序在客戶端進行剩餘的篩選 – Balachandar