2011-08-31 185 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章