2011-08-31 181 views
3

我想在卡桑德拉-0.7.8與ASC/DSC爲了執行SQL操作,如BETWEEN,ORDER BY。卡桑德拉BETWEEN和ORDER BY操作

據我所知,卡桑德拉 - 0.7.8不具有這些操作的直接支持。請讓我知道有沒有辦法通過調整二級索引來實現這些目標?

下面是我的數據模型設計。

Emp(KS){ 
    User(CF):{ 
     bsanderson(RowKey): { eno, name, dept, dob, email } 
    prothfuss(RowKey): { eno, name, dept, dob, email } 
} 
} 

查詢:

- Select * from emp where dept='IT' ORDER BY dob ASC. 
- Select * from emp where eno BETWEEN ? AND ? ORDER BY dob ASC. 

在此先感謝。

問候,

Thamizhananl

+0

是否使用CQL(Cassandra的查詢語言)爲您的查詢? –

回答

3
Select * from emp where dept='IT' ORDER BY dob ASC. 

您可以選擇其中的「部門」列具有一定值的行,通過使用內置的輔助指標。但是,行將按分區程序(RandomPartitioner或OrderPreservingPartitioner)確定的順序返回。要按任意值(例如DOB)排序,您需要在客戶端進行排序。

或者,你可以直接通過使每個部門的行支持這個查詢,併爲每個員工,鍵控(並因此排序)由DOB列。但要小心共享生日!而且,您仍然需要後續查詢來檢索所選員工的其他數據(SELECT *的結果),除非您進行非規範化處理,以便將所需數據存儲在索引中。

Select * from emp where eno BETWEEN ? AND ? ORDER BY dob ASC. 

在卡桑德拉二級索引查詢至少需要一個平等的長期,所以我覺得你可以做部門=「IT」和ENO> = X和ENO < = Y,而不僅僅是間風格查詢。

你可以通過創建自己的索引行,爲每個員工一列,鍵入對員工數量,用適當的比較,以便所有列在員工編號的順序自動排序做到這一點。然後,您可以在該行上進行範圍查詢以獲取匹配員工列表 - 但您需要進一步查詢才能爲每個員工(dob等)檢索其他數據,除非您進行非規範化處理,以便將所需數據存儲在索引中。您仍然需要在客戶端執行dob命令。

+0

非常感謝DNA。我會試驗這些想法。 – Thamizh

1

我所知列將通過在創建列族,你可以使用clustring鍵上您的意見 排序和列家庭糾紛比較排序將由分區 進行排序,我建議你閱讀本文
卡桑德拉權威指南第6章